当将更新合并到我的子树中时,Git出现了混乱。

20

为提高项目的可维护性,我们以前在主仓库中使用了许多子模块,但现在我们开启了一个试验分支,在其中用subtrees替换了全部子模块。

这个方法很有效 - 但是当我尝试更新其中一个subtree时,它错误地将更新合并到了完全错误的目录,甚至不是subtree。

包含实验分支"subtree"的主仓库为:git://github.com/hugowetterberg/goodold_drupal.git

要从中合并更新的仓库为:git://github.com/voxpelli/drupal-oembed.git

通过以下方式进行合并:git merge -s subtree oembed/master

应该合并更新的路径为:sites/all/modules/oembed/

他们被合并到的路径为:modules/aggregator/translations/

有没有人知道如何将更新合并到subtree中或者这个错误可能是什么?

2个回答

20

很不幸,这是“git merge -s subtree”代码中的一个错误(或缺失的功能)。它实际上是在“猜测”您想要合并的子目录。通常情况下,这通常可以神奇地正确完成,但如果您的子目录包含大量更改(或最初为空等),那么它可能会出现惊人的失败。

解决方法如下:

  1. 像上面所做的那样合并文件。

  2. 手动移动所有结果文件到本应该去的位置。

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

将来的合并很可能会正常工作,除非此目录处于难以置信的变化之中。

实验性的“git subtree”命令有一个--prefix参数,应该可以让您覆盖这个问题,但不幸的是,它目前不起作用(因为它需要解决“git merge -s subtree”功能的问题,而且没有时间来解决它)。

总之,这应该是一个罕见的情况,即使将来再次合并同一项目时,也不需要这种解决方法。


7
我刚刚向git提交了一份补丁,它将允许你使用"-Xsubtree="选项明确地覆盖子树,并已被接受。请在git 1.7.0或类似版本中查找该选项。 - apenwarr
2
当您从源代码库中带入单个文件夹(例如 git read-tree --prefix=dest/ -u source_repo/master:folder_in_repo/)而不是整个文件夹时,将即使是微小的更改合并回代码库似乎会导致整个文件夹被放置到代码库的新位置中(即重复)。 - Hari Honor
并不是那么罕见的情况,事实上 :-( - Alexander Gladysh
2
当Git出现问题时,最痛苦的合并就会发生。尝试使用“-X subtree=XX”命令帮助我解决了问题,谢谢。 - shuckc
谢谢大家。这让我感到非常困扰,因为在我的第一个子树实验中,由于我的运气不佳,我自然而然地遇到了这个错误的 bug。 - hakre

12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接