如何Git合并只包含trunk子文件夹的分支?
我目前正在使用svn进行一个项目(服务器版本为1.4,这意味着没有可用的现代合并工具) 我想合并一个工作了好几个星期的分支机构。问题是,在创建分支时,它只是作为子文件夹的副本创建的 项目的Svn结构:如何Git合并只包含trunk子文件夹的分支?,git,merge,git-svn,Git,Merge,Git Svn,我目前正在使用svn进行一个项目(服务器版本为1.4,这意味着没有可用的现代合并工具) 我想合并一个工作了好几个星期的分支机构。问题是,在创建分支时,它只是作为子文件夹的副本创建的 项目的Svn结构: /trunk/folder1 /file1 /file2 folder2 folder3 ... 现在我正努力将一个分支合并回主干 现在的问题是,创建分支的人只复制了/trunk/folder1,而
/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 pull -s subtree <remote>
$git pull-s子树
或
$git merge-s子树
看起来您需要使用子树合并策略
对于第一次合并,请查看以下参考资料:
- 马克斯·普林茨
- 在Git文档中(在Linux上的Git文档中,应以
的形式显示为/usr/share/doc/Git-
)howto/using merge subtree.html
$ 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合并运行得非常非常快