2009-06-02 26 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. 的部分。如果你推到另一台主机,它将不知道移植物,并最终可能破历史记录。