如何Git合并一个只包含trunk的子文件夹的分支?

时间:2009-11-23 15:31:36

标签: git merge git-svn

我目前正在使用svn开发一个项目(服务器版本为1.4,这意味着没有可用的现代合并工具)。

我希望合并一个分支,并在其中进行数周的工作。问题是,在创建分支时,它只是作为子文件夹的副本。

项目的Svn结构:

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

现在我正在努力将一个分支合并回主干。

现在的问题是,创建分支的人只复制/ trunk / folder1而不是整个主干。这给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使用我的主分支的子文件夹作为合并目标。怎么做的?

3 个答案:

答案 0 :(得分:5)

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

所以,试试

recursive

答案 1 :(得分:1)

您似乎需要使用子树合并策略。

对于 首次合并 ,请查看以下参考资料:

或者使用Avery Pennarun的 git-subtree 工具,在Git wiki的InterfacesFrontendsAndTools页面上提及。

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

$ git pull -s subtree <remote>

$ git merge -s subtree <branch>

答案 2 :(得分:0)

对于一次性解决方案,我会在我当地的git repo的工作副本中使用那个烦人的“子文件夹分支”,为了安全而从临时工作分支(“tmp-subdir”)分支,然后使用{{1在该工作分支上将所有文件移动到适当的位置。

由于这可能缺少“trunk”文件的其余部分,我会分支关闭trunk(“tmp-trunk”),并重播/樱桃选择“tmp-subdir”中的所有变更集到“ TMP-主干”。

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

这应该可行,但可能有人会想出一个单行来实现同样的目的。 : - )