2009-07-10 129 views
3

我有一個git-svn結帳我的整個回購(初始化在標準git svn init -t tags -b branches -T trunk $repo_url時尚,然後git svn fetch編)。我手動svn copy $repo_url/branches/branch1 $repo_url/branches/branch2。然後我跑了git svn fetch,git checkout -b local-branch2 branch2,做了幾個提交到branch2,dcommit把他們重新回到SVN回購,並用我的工作完成了branch2。 (爲什麼要分支?我想在git中本地攻擊這個分支,但仍然在SVN中提交併在一些同事的幫助下工作)。git-svn:如何將git提交從一個SVN分支複製到另一個分支?

我沒有做的是合併branch2工作回到branch1。如果我是git checkout -b local-branch1 branch1,那麼git merge branch2,它只是將我的local-branch1指針快速轉發到branch2所在的位置。

相反,我希望git能夠重放自從啓動branch2以來進行的所有提交到branch1,以便我可以將它們中的每一個提交給SVN回購。似乎有辦法做到這一點,但我想不起來。也許git rebase,或者branch2上的每個提交的git cherry-pick? (儘管後者有點乏味)。我寧願不svn將這兩個URL合併在一起,因爲這是一個很大的傷害。

想法?這需要更多解釋的任何部分?

+0

*「爲什麼要分支?」*因爲git。是。 – naught101 2015-01-05 03:54:50

回答

6

不在local-branch1上的branch2上的第一次提交可能是創建branch2的提交,是嗎?這應該顯示爲git中的空提交(例如,消息,但不包含內容)。複製它的sha1標識符。然後在local-branch1中,嘗試git reset --hard branch2 && git rebase --onto [email protected]{1} SHA1(其中SHA1是複製的sha1)。這應該重播所有的提交,除了空的一個回到分支1上。你很可能現在想要做一個交互式重新分配和編輯每個提交,這樣你就可以去掉git-svn-id:這行git-svn爲你添加的(或者你可以寫一個git-filter-branch腳本來完成,如果有足夠的提交)。

出於好奇,你爲什麼要重播每一個提交?如果你想簡單地合併你的修改,那就簡單多了,你可以做git checkout local-branch1 && git merge --squash branch2 && git commit。這會做非快進合併,但實際上並不會產生合併提交(因爲那些混淆了git-svn)。相反,它會產生等效的工作樹,就像合併發生一樣,但只有一個父親。這反映了svn如何合併工作。

+0

看起來像所有的工作,謝謝。 我不想做壁球提交,因爲我想保留每個提交在回購(差異和提交消息),以防萬一我需要稍後退步。不過,下次我必須重新考慮這種方法時,因爲這有點麻煩。 – cbowns 2009-07-10 22:09:23

相關問題