Объединить локальные коммиты Git в один коммит для git-svn - PullRequest
27 голосов
/ 11 сентября 2009

В настоящее время, когда я запускаю git svn dcommit, git создает отдельный коммит в SVN для каждого локального коммита, который я сделал со времени последней синхронизации с SVN. Есть ли способ для dcommit объединить все мои недавние локальные коммиты в один коммит для SVN?

Ответы [ 6 ]

18 голосов
/ 11 сентября 2009
git rebase remotes/trunk --interactive 

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

17 голосов
/ 11 сентября 2009

Нет, но вы можете легко сложить все коммиты вместе. В следующем примере я предполагаю, что вы находитесь в ветке 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 (т.е. использовать master@{1} вместо local)

3 голосов
/ 26 мая 2011

Более простой способ может быть (если в локальной системе накоплено несколько коммитов):

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.
3 голосов
/ 05 ноября 2010

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

Во-первых, перебазируйте вашу ветку на svn и убедитесь, что локальный мастер обновлен:

git svn rebase && git push . remotes/trunk:master

Затем переключитесь на master, объединить и 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         *---*---*---*---*
2 голосов
/ 05 ноября 2010

Это сработало для меня - раздавил несколько коммитов в один коммит, а затем dcommitted на svn:

http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

0 голосов
/ 13 июля 2011

это не работает для меня. Я использую 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

чтобы получить все коммиты от мастера к svn без потери истории для будущего слияния с той же командой

~ Marcel

...