Использование git-svn для объединения ветви svn обратно в транк и транк обратно в ветку - PullRequest
11 голосов
/ 29 января 2010

Итак, я использую git и взаимодействую с репозиторием SVN.

У меня есть SVN TRUNK, который выглядит так:

A-B-C-D

И ветка svn bug_fixes, которая разветвляется при коммите B или C:

 -c-d-e-f-g-h-i

Теперь мне нужно вернуть коммиты cdefghi, которые находятся в моей ветке svn, обратно в ветку master.

Я знаю, что я мог бы просто сделать сдавленный коммит, назовем его squash SQUASH (который будет содержать cdefghi), но тогда мне кажется, что мне придется убить ветку bug_fixes и запустить новую ветвь, чтобы продолжить без перерыва.

Здесь: http://blog.red -bean.com / sussman /? P = 92 они предлагают:

checkout филиал.

merge изменения хозяина в ветке.

Checkout мастер.

merge --reintegrate изменения ветви на master.

Продолжить разработку.

К сожалению, git-svn, похоже, не распознает команду "merge --reintegrate" для SVN.

Так как же мне сделать, чтобы ветвь и мастер имели все коммиты, чтобы можно было продолжить разработку на обоих с помощью команд git-svn?

Ответы [ 5 ]

7 голосов
/ 30 января 2010

Раздел Предостережения в документации git-svn предупреждает

Ради простоты и взаимодействия с менее способной системой (SVN) рекомендуется всем git svn пользователям clone, fetch и dcommit напрямую с сервера SVN и избегать всех git clone / pull / merge / push операции между репозиториями git и ветками.

Автор дает рекомендацию:

Рекомендуемый метод обмена кодом между ветками git и пользователями - git format-patch и git am, или просто dcommit в хранилище SVN.

Адаптация к вашей ситуации

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

, где c и i - соответствующие идентификаторы для коммитов в вашей истории.

3 голосов
/ 01 февраля 2010

Хорошо, вот несколько подходов, которые я нашел:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

или

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

или

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

А потом после всего этого.

git svn dcommit (to commit to master)
git branch -D your_branch

Затем (из svn, потому что git-svn не поддерживает удаление), удалите ветку, и воссоздайте его из багажника и начните цикл заново.

1 голос
/ 23 октября 2013

То, что вы также можете сделать, это cherry-pick , при условии, что вы не будете использовать merge .

Оба утверждения должны быть сделаны в ветке без изменений.

При условии, что c старше i, и вы хотите взять всю последовательность.

git cherry-pick c..i

Или отдельные коммиты

git cherry-pick c d e f g h i
1 голос
/ 17 июня 2010

Если вы выполняете слияние, оно автоматически превращает его в 1 коммит. К сожалению, он не использует внутренне svn: mergeinfo или --reintegrate, как следует, поэтому вы теряете связь с веткой, созданной через 'git svn branch'.

1 голос
/ 31 января 2010

Не будет ли это хорошим случаем для перемещения вашего локального материала (<branchpoint>..i) на нового мастера, полученного из SVN?

...