2009-08-20 42 views
17

我们以前在我们的主要存储库中使用了许多子模块,但为了增加项目的可维护性,我们开始了一个实验分支,我们用子树替换它们。将更新合并到我的子树中时Git混淆

这很好 - 但现在当我试图更新其中一个子树时,它错误地将更新合并到完全错误的目录中,甚至不是子树。

主要仓库,那里的分支“子树”包含了实验分支,是:的git://github.com/hugowetterberg/goodold_drupal.git

存储库中更新文件的合并:混帐://github.com/voxpelli/drupal-oembed.git

合并这样做:混帐合并-s子树透过oEmbed /主

路径的更新应该被合并到:网站/所有/模块/透过oEmbed/

它们合并到该路径:模块/汇聚/译/

任何人都具有如何获得更新到子树的想法或者是什么错误可?

回答

18

不幸的是,这是“git merge -s subtree”代码中的一个bug(或缺少的功能)。它实际上猜想你想合并的子树。通常,这奇迹般地证明是正确的,但是如果你的子树包含很多变化(或者最初是空的,或者其他),那么它可能会失败壮观。

解决它的最好办法是:

  1. 合并文件如同上面一样。

  2. 手动将所有生成的文件移动到应该已经去除的位置。

  3. git commit -a --amend纠正合并提交。

未来的合并可能会正常工作,除非这个目录经常有难以置信的流量。

实验性的“git subtree”命令有一个--prefix参数,应该让你覆盖这个参数,但不幸的是它目前不工作(因为它需要解决“git merge -s subtree”功能,而且还没有是时候做到了)。

无论如何,这应该是一种罕见的情况,即使将来合并同一个项目也不需要解决方法。

+7

我刚刚提交git的补丁,可以让你覆盖子树明确使用'-Xsubtree ='选项,并被接受。在git 1.7.0左右找它。 – apenwarr 2009-12-03 22:53:51

+2

当您从源回购库中引入单个文件夹(例如,'git read-tree --prefix = dest/-u source_repo/master:folder_in_repo /')而不是整个东西时,将即使很小的更改合并到回购看起来似乎导致整个文件夹被放入回购站的新位置(即重复)。 – 2012-01-09 10:45:22

+0

非常罕见的情况下,事实上:-( – 2012-04-11 11:05:45