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

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

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

A-B-C-D

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

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

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

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

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

checkout ветвь.

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

checkout мастер.

merge --reintegrate ветвь изменяется на мастер.

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

То, что вы также можете сделать, это вишневый выбор, при условии, что вы не будете использовать слияние.

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

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

git cherry-pick c..i

Или отдельные фиксации

git cherry-pick c d e f g h i