我目前正在使用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使用我的主分支的子文件夹作为合并目标。怎么做的?
答案 0 :(得分:5)
subtree
合并策略是专门为此用例创建的。它在远程分支中查找与本地分支中的子目录中的文件匹配的文件,如果它确实找到它们,则会在调用“普通”{{1}之前重写所有路径以使两个目录结构匹配。合并策略。
所以,试试
recursive
答案 1 :(得分:1)
您似乎需要使用子树合并策略。
对于 首次合并 ,请查看以下参考资料:
howto/using-merge-subtree.html
的形式出现在Linux上的/usr/share/doc/git-<version>
中)。或者使用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”合并。
这应该可行,但可能有人会想出一个单行来实现同样的目的。 : - )