2009-11-23 38 views
0

我目前正在使用svn(服务器是版本1.4,这意味着没有现代合并工具可用)的项目。如何将Git合并一个只包含trunk子文件夹的分支?

我想合并一个分支,并在其中工作了几个星期。问题在于当创建分支时,它仅作为子文件夹的副本。

项目的SVN结构:

/trunk/folder1 
       /file1 
       /file2 
     folder2 
     folder3 
     ... 

现在,我努力将分支合并回主干。

现在的问题是,创建分支的人只复制/树干/文件夹1,而不是整个树干。这为git-svn创建了一个问题,因为它认为我在该文件夹中创建了一堆文件。

git co master 
git merge branch1 
... 
create mode 100644 trunk/file1 
create mode 100644 trunk/file2 

(假设该文件最初在/trunk/folder1/file1

我没有使用SVN这个原来的原因,是因为太多的conflickts的。 (svn merge需要服务器1.5+,我们只在1.4,svnmerge.py一次只能合并小块,并且需要很多心理负担...我已经用了半天​​时间才得到半途)

使用git merge似乎很有前途,但起初我需要告诉git使用我的主分支的子文件夹作为合并目标。这是如何完成的?

回答

5

合并策略subtree专为此用例而创建。它在远程分支中查找与本地分支中的子目录中的文件相匹配的文件,如果它找到它们,则会在调用“正常”合并策略之前重写所有路径以使两个目录结构匹配。

所以,尽量

git merge -s subtree branch1 
+0

谢谢,但直接在主分支上尝试这个命令只是创建文件(正如我在我的问题中所述)。我该如何告诉git使用哪个目录? – 2009-11-23 22:01:53

+0

这似乎工作(从主人/文件夹1应用时)。我仍然错过了向svn回复,但git合并运行真的非常快 – 2009-11-23 22:43:16

0

对于一次性的解决方案,我会在我的本地git仓库的工作副本中采用那个令人讨厌的“子文件夹分支”,为了安全起见,关闭临时工作分支(“tmp-subdir”),然后使用git filter-branch该工作分支将其所有文件移动到适当的位置。因为这可能缺少“主干”文件的其余部分,所以我会分支出主干(“tmp-trunk”),然后重播/从“tmp-subdir”挑选所有的变更集到“TMP-主干”。

然后应该可以将它与“trunk”合并。

这应该有效,但可能有人会拿出一个单线来实现相同的事情。 :-)

+0

有趣的策略。但一个关键问题是如何使用'git filter-branch'将所有文件移动到子目录 – 2009-11-23 20:03:37

+0

使用'--tree-filter'选项和一些shell脚本魔法。但你肯定会更好使用[Jörg的'git merge -s subtree'单行程](http://stackoverflow.com/questions/1783876/how-to-git-merge-a-branch-that-only -contains-A-子目录-的干线/ 1785690#1785690)。 – ndim 2009-11-23 20:36:31

1

它看起来像你需要使用合并策略。

对于首先合并,看看下面的参考资料:由马库斯·普林茨

  • 的Git文档中How to use the subtree merge strategy

    • Subtree merging and you(应该是目前在Git的文档howto/using-merge-subtree.html,在/usr/share/doc/git-<version>上Linux的)。

    或使用艾利Pennarun git-subtree工具,在InterfacesFrontendsAndTools页面上的Git维基提及。

    对于后续的合并应该够指定子树合并策略:

    $ git pull -s subtree <remote> 
    

    $ git merge -s subtree <branch> 
    
  • 相关问题