С помощью git-svn, чтобы объединить ветки в SVN обратно в багажник и багажник обратно в филиал


Поэтому я использую git и взаимодействую с РЕПО svn.

У меня есть ствол svn, который выглядит следующим образом:

A-B-C-D

И ветвь svn bug_fixes, которая ответвляется при фиксации B или C:

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

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

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

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

checkout ветка.

merge мастер переходит в ветвь.

Checkout хозяин.

merge --reintegrate ветвь переходит на мастера.

Продолжайте разработку.

К сожалению, git-svn, похоже, не распознает никаких команд "объединить-реинтегрировать" для svn.

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

5 11

5 ответов:

Раздел предостережений 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 - соответствующие идентификаторы для коммитов в вашей истории.

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

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 не поддерживает удаление) удалите ветку, и воссоздать его из ствола и начать цикл заново.

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

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

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

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

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

git cherry-pick c..i

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

git cherry-pick c d e f g h i