我们有一个具有稳定主干和不稳定开发分支的 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
并非绝对有必要获得与图片完全相同的图表。任何可以将 A 识别为共同祖先的图表对我来说都很好。
我有一些选择,例如正确使用 git-filter-branch 或从未提交给 SVN 的“假”提交。然而,到目前为止,我的任何尝试都没有奏效。
我很感激你能提出任何想法。该过程不必是自动的。合并非常罕见,我可以忍受“手工”完成的痛苦。