Я мигрировал в git, используя git-svn. Наш svn-репозиторий все еще в такте, и мы все еще получаем всю «git awesomeness». По сути, после клона git-svn вы снова разветвляете его как «ствол». Все, кто использует git, будут разветвляться отсюда. Когда вам нужно получить обновления от svn, вы просто выполняете git-svn rebase, а затем выполняете git merge --squash из ветви svn в новый «транк». И наоборот. Это будет означать, что ваша история в репозитории svn не будет соответствовать тому, что есть в git. Когда вы делаете более одного слияния, в какой-то момент вам придется начинать прививать коммиты, потому что история не совпадает. Однако, если вы привяжете ГОЛОВУ своего ствола git к последнему идентификатору коммита, который был сжатым слиянием, вы получите тот же эффект.
Хорошо, позвольте мне разбить это как можно лучше на примере.
svn репо:
SVN: //xyz.com/myproject
git svn clone svn://xyz.com/myproject
Это должно оставить вас с обычной настройкой git-svn с главной веткой, которая имеет ту же историю, что и хранилище svn.
git checkout -b git_trunk
git_trunk становится «стволом» для пользователей git.
Эта ветка может свободно использоваться как любой другой репозиторий git.
Теперь вам нужно синхронизировать эти две ветви с помощью git merge --squash
Например .. слияние с основной ветки svn в git_trunk
git checkout git_trunk
git merge --squash master
git commit -a
Вы бы сделали то же самое, чтобы слиться с git_trunk и master svn.
кроме как выполнить
git svn dcommit
Это вернет его к SVN.
Так что сложная часть здесь в том, что, поскольку мы используем --squash, история слияния потеряна, и единственный общий предок, о котором когда-либо будет знать git, это точка ветвления. Это будет означать конфликты слияния. То, как я решил это, было сделано что-то вроде этого
Слияние с git_trunk в master. Сначала я беру идентификатор коммита последнего сквоша на git_trunk. Давайте назовем это ABCDEFG. Тогда я получаю коммит-г git_trunk. Допустим, его HIJKLMNO
echo "HIJKLMNO ABCDEFG" > .git/info/grafts
Это сообщит git при слиянии, что самым распространенным предком является последний сдавленный коммит.
Это не идеально, но прекрасно работает для меня. Особенно сейчас, так как почти все на Git.