Ответ 1
Основываясь на том, что я видел, этот рабочий процесс не поддерживается git -svn, и не будет, из-за того, как SVN представляет собой слияние.
У меня есть рабочее дерево git -svn. Я хотел бы клонировать "чистый" git repo от этого, а затем использовать git push/pull для перемещения изменений между деревом git -svn и деревом git, а также используя git svn dcommit/rebase 'для перемещения изменений между деревом git -svn и репо SVN на основе.
Кажется, что все работает хорошо, перемещая вещи между деревьями git, используя методы git, но как только я взаимодействую с репо SVN в дереве git -svn, все становится неустойчивым - либо я получаю ошибки при нажатии или вытягивании между деревьями git, либо я теряю фиксации в дереве git -svn или другой нечетности.
Поддерживается ли этот тип SVN ↔ git -svn ↔ git рабочий процесс или я должен просто прекратить лаять это дерево?
Основываясь на том, что я видел, этот рабочий процесс не поддерживается git -svn, и не будет, из-за того, как SVN представляет собой слияние.
У меня есть настройка моста для некоторых моих проектов, но это только одностороннее от git до svn (предоставление публичного зеркального отображения SVN нашей главной ветки git). Однако, поскольку он работает нормально, это может помочь вам или указать вас в правильном направлении в вашем двухстороннем сценарии в любом случае, так как я предполагаю, что это git → svn, что создает проблемы, а не svn → git:
Мой односторонний сценарий: существующий репозиторий git в github, нужно только для чтения svn зеркало git master branch
Создайте и инициализируйте целевой репозиторий subversion на сервере:
svnadmin create svnrepo
mkdir trunk
svn import trunk svn://yoursvnserver/svnrepo
rmdir -rf trunk
Создайте смешанный git -Svn checkout и инициализируйте репозиторий subversion
git svn clone svn://yoursvnserver/svnrepo/trunk
cd trunk
git remote add github git://github.com/yourname/repo.git
git fetch github
git branch tmp $(cat .git/refs/remotes/github/master)
git tag -a -m "Last fetch" last tmp
INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1)
git checkout $INIT_COMMIT .
git commit -C $INIT_COMMIT
git rebase master tmp
git branch -M tmp master
git svn dcommit --rmdir --find-copies-harder
Обновить зеркало
git fetch github
git branch tmp $(cat .git/refs/remotes/github/master)
git tag -a -m "Last fetch" newlast tmp
git rebase --onto master last tmp
git branch -M tmp master
git svn dcommit --rmdir --find-copies-harder
mv .git/refs/tags/newlast .git/refs/tags/last
Эти две статьи из googlecode также могут помочь:
Одна вещь, которая может вызвать у вас проблемы, заключается в том, что git svn dcommit
перепишет все коммиты, которые она отправляет SVN, по крайней мере, если она настроена на добавление заметки метаданных SVN в нижней части сообщений фиксации. Таким образом, вам нужно будет принять поток, в котором любые репозитории, взятые из вашего рабочего пространства git -svn, будут перезагружаться против него, потеряв всю историю слияния, которая не может быть сохранена в SVN в любом случае.
Как я часто говорил на # git:
git -svn похож на летающую машину. Все хотят летать, пока они не поймут, что летающий автомобиль довольно плох, как автомобиль или самолет.
Реальное решение - как можно быстрее уйти от SVN. Используйте git -svn для одноразовой миграции, а затем переместите все. Git не так сложно узнать.
Если вы можете установить пользовательские перехватчики в репозиторий Subversion, рассмотрите возможность использования SubGit.
SubGit - это серверное решение, которое автоматически синхронизирует репозитории SVN и Git. Чтобы установить SubGit, выполните следующие действия:
$ subgit configure $SVN_REPOS
$ # Adjust $SVN_REPOS/conf/subgit.conf
$ # to specify your branches and tags
$ # Adjust $SVN_REPOS/conf/authors.txt
$ # to introduce svn author names to their git counterparts
$ subgit install $SVN_REPOS
$ ...
$ INSTALLATION SUCCESSFUL
В этот момент SubGit установил крючки, которые запускаются каждым svn commit
и git push
. Таким образом SubGit преобразует любую входящую модификацию.
См. также сравнение с git -svn.
Используя git и git -svn 1.7.1, кажется, что тест, который я только что сделал, кажется, работает нормально.
git svn init [url]
git svn fetch
Затем вы должны создать и проверить фиктивную ветку, чтобы иметь возможность нажать на главную ветвь.
git checkout -b dummy
Затем вы можете клонировать его (git clone ...
) в другой чистый репозиторий git, модифицировать его, зафиксировать (git commit
), а затем нажать (git push
) в репозиторий git -svn.
вернуться к git svn repo:
git checkout master
git svn dcommit
выполнит все git фиксации, которые были нажаты.