首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何愚弄git-svn以识别与svn相结合的合并?

如何愚弄git-svn以识别与svn相结合的合并?
EN

Stack Overflow用户
提问于 2009-06-02 05:44:38
回答 4查看 665关注 0票数 5

我们有一个SVN设置,有稳定的主干和不稳定的开发分支。开发工作(大部分)是在分支上完成的,然后在部署之前合并到主干。

我用git-svn作为我的SVN客户端。从不稳定到主干的合并过程如下:

代码语言:javascript
运行
复制
git svn fetch
git co -b trunk svn/trunk 
git merge --no-ff svn/unstable
git svn dcommit

svn/*是远程SVN分支。

当然,这要求在我做完之前没有人向后备箱提交任何东西,但这在实践中并不是一个问题。

这个过程的好处是git现在在我的本地存储库中记录合并提交的父级。这对我的同事没有好处,但当我进行合并时,它确实允许git计算共同祖先。这是非常可取的。

这就是问题所在。当其他人进行合并时,git不知道。下面是一个示例:

代码语言:javascript
运行
复制
  o-...-A---o---C--- unstable
 /
X--...--B---o---o--- stable

不稳定分支是在点X处创建的。在A点,我们决定将不稳定分支的变化合并到B点的稳定分支中。

由于合并没有记录在git历史记录中,下面C处的合并再次假定X是共同的祖先。我希望它是A,如下图所示:

代码语言:javascript
运行
复制
  o-...-A---o---C--- unstable
 /       \
X---...---B---o---o--- stable

这不是绝对有必要得到一个图形,看上去完全像一个图片。任何能识别A为共同祖先的图形对我来说都很好。

我有一些选择,如正确使用git-过滤器分支或“假”提交,从来没有到SVN。然而,到目前为止,我的尝试都没有取得足够的效果。

我很感谢你能提出的任何想法。程序不必是自动的。合并是非常罕见的,我可以忍受“用手”的痛苦。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-19 11:21:36

另一种选择是使用Grafts文件,它允许您在不实际操作历史记录的情况下覆盖提交的父级。

这意味着,在SVN存储库中看到合并后,只需向..git/info/graft添加一行,其中包含合并提交(M)的SHA-1及其父级(A、B)。

代码语言:javascript
运行
复制
      o-...-A---o---D--- unstable
     /       
    X-----B---M---o---o--- stable

A = 31423cd8a838f984547a908777308d846043cbda
B = d99cfccb1f859a8f1dbfac95eec75227fe518b23
M = 13319a54d3e3d61b501e7cc6474c46f37784aaa3

为了从A创建链接,您可以将M的父母指定为B和A。移植物文件的格式相当简单:

代码语言:javascript
运行
复制
commit newparent1 ... newparentN

这意味着将以下(相当长的)行添加到移植物文件中:

代码语言:javascript
运行
复制
13319a54d3e3d61b501e7cc6474c46f37784aaa3 d99cfccb1f859a8f1dbfac95eec75227fe518b23 31423cd8a838f984547a908777308d846043cbda

Git现在将假装实际发生了此合并。作为一个缺点,这并不是通过git push/fetch/克隆来传播的,但这不应该成为个人发展的主要问题。

票数 2
EN

Stack Overflow用户

发布于 2009-06-02 06:24:37

相反,您的问题有点像SVN populating svnmergeinfo from git merges

您不希望SVN记录Git的合并,而希望Git记录SVN的合并;)

由于git-svn在从SVN导入时不关心svnmergeinfo属性,因此留下了一个“手动操作”选项。

我不推荐git-filter-branch解决方案或重写Git方面历史的任何东西。

如果您知道SVN上有"A->B“合并,则应该在Git **上进行”合并“分支中的合并,然后将其合并回稳定分支(此时进行简单的合并),从而向当前的稳定历史添加一个新的提交。

代码语言:javascript
运行
复制
    o-.....-A---o---C--- unstable
   /         \
  /           o-------\__ merge recorder branch
 /           /         \
X---.....---B---o---o---o__ stable

然后,从C到稳定的合并应该以A为共同祖先。

票数 2
EN

Stack Overflow用户

发布于 2010-12-16 12:05:57

因为git 1.6.6,这应该会自动发生。

“* "git”学会阅读SVN 1.5+和SVK合并票。“

在:

http://www.kernel.org/pub/software/scm/git/docs/RelNotes/1.6.6.txt

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/938041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档