2014-10-27 8 views
1

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

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

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

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

я легко узнал, как очистить большие капли из истории (БФГ, GIT Filter- филиал).

Мой вопрос:

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

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

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

+0

Импорта всего репозитория в Git, а затем выбросить ветки не заинтересованы в – poke

+0

Бросить прочь часть будет интересно один.: D Как мы можем выбросить их и искоренить их из истории репо? – Patrick

ответ

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, включая те части из двух других версий, которые являются частью ее истории.Если вы также хотите удалить это, вы можете применить метод, описанный в this question, чтобы удалить старую историю до точки перехода версии 3.

2

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

Init мерзавец репо с URL SVN в папке tmp

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

Обновление «/ конфигурации .git» файл клоном только конкретные отрасли. В этом случае мы будем клонировать только ветви, которые соответствуют шаблону 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 

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

Смежные вопросы