Миграция SVN в Git: импортировать только определенные ветки и историю

Моя команда готовится перейти на Git, и мы хотели бы начать с небольшого репозитория. Начальный репозиторий Git, созданный git-svn, имеет размер около 10 ГБ из-за двоичных файлов и сотен веток версий.

Очистить большие файлы легко, но самая сложная часть - это количество ветвей.

Для миграции git мы хотели бы начать в определенный момент времени (X) только с определенными (новейшими) ветвями. У нас нет «ствола», а вместо этого есть разные ветки версий. которые сохраняются в течение более длительного периода времени:

 ---- Version 1 ------------------------
     \---------- Version 2--------------
                \--------- Version 3----

Я легко узнал, как убрать большие капли из истории (BFG, git filter-branch).

Мой вопрос:

Как мы можем удалить все ветки, кроме нескольких конкретных, из истории, чтобы у нас была, скажем, ветка «версия 3» в новом репозитории? В идеале мы бы хотели, чтобы история начиналась с начальной фиксации, в которой была создана эта ветка:

 --------- Version 3----

Есть ли способ сделать это с помощью git filter-branch или другой возможности?


person Patrick    schedule 27.10.2014    source источник
comment
Импортируйте весь репозиторий в Git, а затем выбросьте те ветки, которые вам не интересны.   -  person poke    schedule 27.10.2014
comment
Часть выброса была бы интересной: D Как мы можем выбросить их и искоренить из истории репо?   -  person Patrick    schedule 27.10.2014


Ответы (2)


Импортируйте весь репозиторий в Git, а затем выбросьте те ветки, которые вам не интересны.

Часть выброса была бы интересной: D Как мы можем выбросить их и искоренить из истории репо?

Что ж, как работает Git, ветки - это просто указатели на коммиты в истории репозитория. Ветви существуют, потому что эти указатели существуют, чтобы указывать на них. Если убрать указатели, ветки просто исчезнут. И если ничто иное не указывает на эти коммиты, они по существу удаляются из репозитория.

Теперь, помимо веток, есть еще одна важная вещь, которая обычно указывает на коммиты и удерживает внимание: более новые коммиты зависят от них. История Git - это большое ациклическое дерево, в котором каждый коммит имеет родительский коммит, на который он указывает. Таким образом, старые коммиты остаются, даже если ни одна ветвь не указывает на них явно; и этим работает вся история.

Поэтому, если вы хотите избавиться от целой строки коммитов (отдельной ветки), и эти коммиты не были объединены в другую ветку в какой-то момент, то все, что вам нужно сделать, это удалить ветку из репозитория. Тогда ничто не будет указывать на строку коммитов, и они будут удалены, когда вы соберете мусор в репозитории:

git branch -D Version_1
git branch -D Version_2
git gc --prune=now

Это приведет к принудительному удалению ветвей Version_1 и Version_2 из репозитория, а затем запустит сборку мусора, которая удалит из репозитория все объекты, на которые нет указателя.

После этого у вас остается полная история для Version_3, включая те части из двух других версий, которые являются частью его истории. Если вы хотите удалить и это, вы можете применить метод, описанный в этот вопрос, чтобы удалить старую историю до точки ветвления версии 3.

person poke    schedule 27.10.2014

Я знаю, что это опоздание на несколько лет, но на случай, если кто-то ищет ответ, выберите всего несколько веток, которые не связаны с клонированием всего этого:

Запустите репозиторий git с URL-адресом SVN в папке tmp

git svn init -T <main_branch_name> <repo_url> tmp

Обновите файл «.git / config», чтобы клонировать только определенные ветки. В этом случае мы собираемся клонировать только ветки, соответствующие шаблону feature*

[svn-remote "svn"]
   noMetadata = 1
   url = <repo_url>
   fetch = trunk:refs/remotes/origin/trunk
   branches = branches/feature*:refs/remotes/origin/*  ## Added line

Теперь вы можете получать файлы из репозитория SVN.

git svn fetch -r $NUMBER:HEAD

Дополнительная информация:

person Oscar Vasquez    schedule 31.05.2017