1

为了我的生活,我无法git subtree merge上班。这是我的情况:

我正在开发Moodle的一个内置部分,称为 Workshop。代码位于mod/workshop目录中moodle。我必须将我的本地 Moodle 升级到 2.5 并让我的 Workshop 更改在其中工作。所以,对我来说显而易见的解决方案是:

  1. MOODLE_25_STABLE从上游签出分支
  2. 创建一个MOODLE_25_STABLE_workshop基于该分支调用的分支
  3. mod/workshop从我的MOODLE_23_STABLE_workshop分支合并到MOODLE_25_STABLE_workshop

如果我想将每个文件合并到其中,那将很容易,但我只对重播对目录的提交感兴趣。有没有比完成六个月的提交更简单的方法?因为我真的,真的不想那样做。MOODLE_23_STABLE_workshopMOODLE_25_STABLE_workshopmod/workshopcherry-pick

我已经尝试过的事情:

$ git subtree merge --prefix=mod/workshop/ MOODLE_23_STABLE_workshop:mod/workshop
error: 402c67f6fedc96a6fed76e663df4e5af9dfa094e: expected commit type, but the object dereferences to tree type

$ git merge -s ours --no-commit MOODLE_23_STABLE_workshop
$ git read-tree --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
error: Entry 'mod/workshop/aggregate.php' overlaps with 'mod/workshop/aggregate.php'.  Cannot bind.
$ gormster:Documents/moodle$ git read-tree -m --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
fatal: Which one? -m, --reset, or --prefix?

任何指导表示赞赏。

4

1 回答 1

1

好吧,合并(没有处理交叉合并策略的递归部分)只是用从最近的共同祖先到远程的差异来修补本地树。

有一个命令可以获取合并基础,git merge-base但如果您使用(3 而不是 2 点) 运算符,git diff甚至可以自己调用它。...

所以合并是:

git diff HEAD...MOODLE_23_STABLE_workshop -- mod/workshop/ | git apply -3

而不是你提交它。

您可能不应该尝试将录音MOODLE_23_STABLE_workshop作为基础,因为事实并非如此。如果你这样做了,下一次合并将假定你合并了所有更改并显式还原了外部的更改mod/workshop/。另一方面,如果您不记录父级,则下一次合并将尝试重新应用更改,如果再次修改相同的区域,则会导致不必要的冲突,因为 git 足够聪明,可以识别已经应用的差异,但无法分辨当差异淘汰其他更改时。

于 2013-09-26T06:09:02.620 回答