В настоящее время при запуске git svn dcommit
git создается отдельная фиксация в SVN для каждого локального коммита, который я сделал с момента последней синхронизации с SVN. Есть ли способ для dcommit
вместо этого объединить все мои последние локальные коммиты в одну фиксацию для SVN?
Объединение локального Git совершает одно коммит для git -svn
Ответ 1
git rebase remotes/trunk --interactive
должен привести вас в меню, в котором вы можете выбрать коммиты или раздавить их все в 1 commit, чтобы не загрязнять ваш репозиторий svn. Это - действительно хороший (но короткий) ресурс при работе с git -svn.
Ответ 2
Нет, но вы можете легко смириться со всеми коммитами. В следующем примере я предполагаю, что вы находитесь на ветке master
, соответствующей удаленной ветке trunk
, и хотите, чтобы вы смешали все локальные коммиты вместе:
git tag local # create a temporary tag
git reset --hard trunk
git merge --squash local
git commit # write your single commit message here
git svn dcommit
git tag -d local # delete the temporary tag named local
Вместо использования временного тега вы также можете просто использовать reflog (т.е. использовать [email protected]{1}
вместо local
)
Ответ 3
Когда я работаю с git -svn и хочу, чтобы серия из git собиралась отображаться как одна фиксация, я работаю на ветке темы, а затем выполняю непродолжительное переключение merge
в master перед dcommit
-ную.
Сначала переустановите ветку на svn и убедитесь, что локальный мастер обновлен:
git svn rebase && git push . remotes/trunk:master
Затем переключитесь на master, merge и dcommit:
git checkout master
git merge <branch> --no-ff -m "Message you want in svn"
git svn dcommit
Это будет отображаться как одно коммит в Subversion, но вы все равно будете иметь свою локальную историю, которая заставила бы вас совершить это.
+--- Merge commit
V
svn trunk *---*---*-------------------*--- --- ---
\ /
topic branch *---*---*---*---*
Ответ 4
Более простой способ может быть (если у вас в вашей локальной системе много коммитов):
git reset <hash tag of commit till which u need to combine>
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used.
Ответ 5
Это сработало для меня - раздавило несколько коммитов в одно коммит, а затем dcommitted в svn:
http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
Ответ 6
который не работает для меня. Я использую merge --no-ff --no-commit
, но после фиксации я получил:
svntrunk 54f35e4 [trunk: ahead 336] release 1
dcommitting to trunk будет совершать все 336 коммитов.
сброс, тегирование и раздавливание, как описано в ответе # 2: Объединить локальный Git, зафиксировать в одном коммите для git -svn, будет работать, но следующее "слияние" у вас будет некоторая проблема, чтобы снова собрать все коммиты!
тот, который работает для меня:
git checkout -tb svntrunk remotes/trunk
git merge --no-commit --squash master
чтобы получить все фиксации от master до svn без потери истории для будущего слияния с той же командой
~ Marcel