代码之家  ›  专栏  ›  技术社区  ›  Antti Rasinen

如何欺骗git svn来识别用svn进行的合并?

  •  5
  • Antti Rasinen  · 技术社区  · 17 年前

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

    我使用git svn作为我的svn客户端。我从unstable到trunk的合并过程如下:

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

    svn/*

    一、

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

    不稳定分支是在点X创建的。在点A,我们决定将不稳定分支的更改合并到点B的稳定分支中。共同的祖先是正确的X。

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

    4 回复  |  直到 17 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    另一种选择是使用Grafts文件,它允许您覆盖提交的父级,而无需实际操纵历史记录。

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

          o-...-A---o---D--- unstable
         /       
        X-----B---M---o---o--- stable
    
    A = 31423cd8a838f984547a908777308d846043cbda
    B = d99cfccb1f859a8f1dbfac95eec75227fe518b23
    M = 13319a54d3e3d61b501e7cc6474c46f37784aaa3
    

    commit newparent1 ... newparentN
    

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

    13319a54d3e3d61b501e7cc6474c46f37784aaa3 d99cfccb1f859a8f1dbfac95eec75227fe518b23 31423cd8a838f984547a908777308d846043cbda
    

    Git现在将假装此合并确实发生了。缺点是,这不会通过git push/fetch/clone传播,但这对个人发展来说应该不是一个大问题。

        2
  •  2
  •   NTmatter    17 年前

    你的问题有点像 SVN populating svnmergeinfo from git merges
    您不希望SVN从Git记录合并,而是希望Git从SVN记录合并;)

    自从 git-svn svnmergeinfo 从SVN导入时的属性,留下“手动操作”选项。

    git-filter-branch
    如果你知道一个“ A->B

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

    那么从C到stable的合并应该有a作为共同祖先。

        4
  •  0
  •   elupus elupus    17 年前

    小心移植物。

    1. 如果他们做错了,git gc将(过一段时间)删除部分历史记录
    2. 如果你把它推给另一个宿主,它就不会知道移植物,最终可能会断送历史。