С помощью 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 ответов:
Раздел предостережений
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