Ретроактивный импорт SVN в GIT - PullRequest
10 голосов
/ 20 января 2009

Вот моя проблема:

  1. Я некоторое время использовал Subversion, пока не переключился на Git. Прошло еще немного времени.
  2. Не было импорта истории из Subversion в Git. Это был строгий контроль, удаление .svn dirs, затем git init. Не умный ход.
  3. Теперь, спустя тысячи git-коммитов, я нахожу резервную копию репозитория Subversion, сделанного во время первого git-коммита. Aha!

Я бы хотел откатить репозиторий git до дня 0, правильно импортировать репозиторий svn, затем повторно применить все изменения git, исправляя, таким образом, то, что не было сделано в первый раз.

Кто-нибудь пытался это сделать? Как бы я поступил так? Звучит как мать всех ребязов.

Ответы [ 2 ]

15 голосов
/ 20 января 2009

Звучит как работа для мерзавцев. Документация для этого немного схематична, но в основном вы хотите сделать следующее:

  1. Получите git-svn копию svn в вашем репо. Самый простой способ сделать это - ввести git svn clone, а затем получить svn clone из вашего существующего репозитория
  2. Выясните, какой базовый коммит должен следовать за SVN коммитом. Таким образом, вы, вероятно, где-то имеете git root («Последняя версия SVN»), который должен следовать последней актуальной версии SVN. Это глава клона git-svn, которую вы только что загрузили
  3. Создайте файл .git / info / grafts и поместите два ша в одну строку. Первый - это первый git commit, затем пробел, затем последний svn commit. Это говорит git, что коммит git не родительский, но фактически имеет последний коммит svn в качестве родителя.
  4. Теперь вы можете проверить с помощью gitk / gitx / что бы два хранилища не были связаны
  5. Чтобы сделать изменение постоянным, запустите git filter-branch. Возможно, вы сначала захотите прочитать его справочную страницу.

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

1 голос
/ 20 января 2009

Я никогда не пробовал, что вы хотите, но я делаю что-то похожее с CVS.

По сути, я бы предложил:

  1. Создайте новый репозиторий git с историей из SVN
  2. В этом новом репозитории git fetch все из репозитория git (общих коммитов не будет)
  3. Затем git branch remote/branch branch-last и git rebase --onto svn-last remote/branch-first branch-last, где remote/branch-first - это первая фиксация вашего импортированного репозитория git и т. Д.

Если у вас больше ветвей, все будет сложнее. Я думаю, что может повторить шаг 3, но вам лучше попробовать себя. Если в вашей истории git есть слияния, вам может понадобиться git rebase -i -p .... Помните, преимущество git в том, что вы ничего не можете испортить (особенно если вы работаете в отдельном репозитории).

...