2009-06-02 44 views
5

我們有一個穩定的主幹和不穩定的開發分支的SVN設置。開發工作(大部分)在分支上完成,然後在部署之前合併到主幹。如何愚弄git-svn以識別與svn合併?

我使用git-svn作爲我的SVN客戶端。從不穩定到中繼的合併過程如下:

git svn fetch 
git co -b trunk svn/trunk 
git merge --no-ff svn/unstable 
git svn dcommit 

svn/*是遠程SVN分支機構。

當然,這需要一個沒有任何承諾到主幹我之前做,但這不是在實踐中的問題。

這個過程的好處是,git現在在我的本地存儲庫中記錄合併提交的父母。這對我的同事沒有好處,但它確實允許git在合併時計算共同的祖先。這是非常可取的。

這裏是擦。當其他人進行合併時,git不知道它。這裏有一個例子:

o-...-A---o---C--- unstable 
/
X--...--B---o---o--- stable 

不穩定分支在X點產生在A點,我們決定合併點B.從不穩定分支變成穩定分支的共同祖先是正確X.

由於合併未記錄在git歷史記錄中,因此C處的以下合併再次假定X是共同祖先。我想它是A,如下面的圖:

o-...-A---o---C--- unstable 
/  \ 
X---...---B---o---o--- stable 

這是完全沒有必要讓看起來像exacly與圖片中顯示的圖表。任何能夠將A識別爲共同祖先的圖形對我來說都很好。

我心中有一個選項,如正確使用git的過濾分支的或「假」犯下這是從來沒有dcommited到SVN。然而,迄今爲止,我的嘗試都沒有充分發揮作用。

我很感激你能提出的任何想法。程序不一定是自動的。合併是非常罕見的,我可以忍受「手工」的痛苦。

回答

2

另一種方法是使用Grafts文件,該文件允許您在不實際操作歷史的情況下覆蓋提交的父項。

這意味着,在SVN存儲庫中看到合併後,只需將合併提交(M)的SHA-1及其父項(A,B)添加到.git/info/grafts )。

 o-...-A---o---D--- unstable 
    /  
    X-----B---M---o---o--- stable 

A = 31423cd8a838f984547a908777308d846043cbda 
B = d99cfccb1f859a8f1dbfac95eec75227fe518b23 
M = 13319a54d3e3d61b501e7cc6474c46f37784aaa3 

爲了創建AM的鏈接,你會指定M的父母爲B和A的移植文件的格式非常簡單:

commit newparent1 ... newparentN 

這意味着你添加以下(相當長)行到您的移植文件:

13319a54d3e3d61b501e7cc6474c46f37784aaa3 d99cfccb1f859a8f1dbfac95eec75227fe518b23 31423cd8a838f984547a908777308d846043cbda 

Git現在會假裝實際發生此合併。作爲缺點,這不會通過git push/fetch/clone傳播,但這不應該是個人開發的主要問題。

2

你的問題有點像SVN populating svnmergeinfo from git merges相反:
你不想SVN記錄從Git的合併,但GIT中記錄從SVN合併;)

由於git-svn導入時不關心svnmergeinfo屬性來自SVN,這留下了「手動操作」選項。

我不會推薦一個git-filter-branch解決方案或任何其重寫的Git的履歷。
如果你是知道的「A->B」合併對SVN,你應該做的是在Git的**合併「合併」分支,然後將其合併右後衛進入穩定分支(瑣碎合併在這一點),從而爲您當前的穩定歷史添加新的提交。

o-.....-A---o---C--- unstable 
/  \ 
/   o-------\__ merge recorder branch 
/  /  \ 
X---.....---B---o---o---o__ stable 

然後從C到stable的合併應該有A作爲共同的祖先。

+0

權!所以關鍵是做_two_中間提交,其中一個最終也在SVN中結束。這似乎至少在紙上起作用。感謝您的信息!我想知道是否有可能把這個變成git別名... – 2009-06-02 09:38:34

+0

你忘了在「merge」分支中結束你的「**」(粗體)......「Git **」 – 2009-07-19 11:35:46

0

小心移植文件你。

  1. 做他們錯了,一個git GC將(一段時間後)下降的歷史
  2. 的部分。如果你推到另一臺主機,它將不知道移植物,並最終可能破歷史記錄。