Используя 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