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

如何Git合并只包含trunk子文件夹的分支?,git,merge,git-svn,Git,Merge,Git Svn,我目前正在使用svn进行一个项目(服务器版本为1.4,这意味着没有可用的现代合并工具) 我想合并一个工作了好几个星期的分支机构。问题是,在创建分支时,它只是作为子文件夹的副本创建的 项目的Svn结构: /trunk/folder1 /file1 /file2 folder2 folder3 ... 现在我正努力将一个分支合并回主干 现在的问题是,创建分支的人只复制了/trunk/folder1,而

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

我想合并一个工作了好几个星期的分支机构。问题是,在创建分支时,它只是作为子文件夹的副本创建的

项目的Svn结构:

/trunk/folder1
              /file1
              /file2
       folder2
       folder3
       ...
现在我正努力将一个分支合并回主干

现在的问题是,创建分支的人只复制了/trunk/folder1,而不是整个trunk。这给git svn带来了一个问题,因为它认为我在文件夹中创建了一堆文件

 git co master
 git merge branch1
 ...
 create mode 100644 trunk/file1
 create mode 100644 trunk/file2
(假设文件最初位于
/trunk/folder1/file1

我不使用svn的最初原因是因为有太多的冲突。(
svn merge
需要服务器1.5+,而我们只使用1.4,
svnmerge.py
一次只能合并小块,需要大量的精神负担……我用了半天的时间才完成了一半)


使用
git merge
似乎很有希望,但首先我需要告诉git使用主分支的子文件夹作为合并目标。如何做到这一点?

对于一次性解决方案,我会在本地git repo的工作副本中使用恼人的“子文件夹分支”,为安全起见,从临时工作分支(“tmp subdir”)分支,然后在该工作分支上使用
git筛选器分支
将其所有文件移动到适当的位置

由于这可能缺少“trunk”的其余文件,因此我将分支出trunk(“tmp trunk”),并重播/切利选择从“tmp subdir”到“tmp trunk”的所有变更集

然后应该可以将其与“主干”合并


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

对于一次性解决方案,我会在本地git repo的工作副本中使用恼人的“子文件夹分支”,为安全起见,从临时工作分支(“tmp subdir”)分支,然后在该工作分支上使用
git filter branch
将其所有文件移动到适当的位置

由于这可能缺少“trunk”的其余文件,因此我将分支出trunk(“tmp trunk”),并重播/切利选择从“tmp subdir”到“tmp trunk”的所有变更集

然后应该可以将其与“主干”合并


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

子树合并策略是专门为此用例创建的。它在远程分支中查找与本地分支的子目录中的文件匹配的文件,如果确实找到了这些文件,它将重写所有路径,以使两个目录结构匹配,然后再调用“普通”递归合并策略

所以,试试看

git merge -s subtree branch1

子树
合并策略是专门为此用例创建的。它在远程分支中查找与本地分支的子目录中的文件匹配的文件,如果确实找到了这些文件,它将重写所有路径,以使两个目录结构匹配,然后再调用“普通”递归合并策略

所以,试试看

git merge -s subtree branch1

看起来您需要使用子树合并策略

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

  • 马克斯·普林茨
  • 在Git文档中(在Linux上的Git文档中,应以
    /usr/share/doc/Git-
    的形式显示为
    howto/using merge subtree.html
或者使用Git wiki页面上提到的Avery Pennarun的工具

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

$ git pull -s subtree <remote>
$git pull-s子树

$git merge-s子树

看起来您需要使用子树合并策略

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

  • 马克斯·普林茨
  • 在Git文档中(在Linux上的Git文档中,应以
    /usr/share/doc/Git-
    的形式显示为
    howto/using merge subtree.html
或者使用Git wiki页面上提到的Avery Pennarun的工具

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

$ git pull -s subtree <remote>
$git pull-s子树

$git merge-s子树

有趣的策略。但一个关键问题是如何使用
git filter branch
将所有文件移动到一个子目录中,其中包含
--tree filter
选项和一些shell脚本魔术。但你肯定会更好地使用。有趣的策略。但一个关键问题是如何使用
git filter branch
将所有文件移动到一个子目录中,其中包含
--tree filter
选项和一些shell脚本魔术。但是使用.肯定会更好,谢谢,但是直接在主分支上尝试这个命令只会创建文件(正如我在问题中所描述的)。如何告诉git使用哪个目录?这似乎有效(从master/folder1应用时)。我仍然无法将dcommit返回到svn,但是git merge运行得非常非常快,谢谢,但是直接在master branch上尝试此命令只会创建文件(如我在问题中所述)。如何告诉git使用哪个目录?这似乎有效(从master/folder1应用时)。我仍然无法将数据提交回svn,但是git合并运行得非常非常快