如何使用Mercurial将功能分支与具有子存储库的默认值合并

时间:2013-03-06 02:37:20

标签: mercurial branching-and-merging mercurial-subrepos

我有许多子存储库项目:

/project              <- Main repository
/project/src          <- Source code subrepository  (subrepository to /project)
/project/src/module   <- Module subrepository (subrepository to /project/src repository)

我现在已经开发了一个功能分支( feature1 ),它有一些修改,我现在想要合并回默认分支。自创建 feature1 分支以来,默认分支没有任何更改。

我已尝试将分支合并为默认值,但最终会在子存储库中发生一些奇怪的事情。

我已按照此other post中的说明操作,并获得以下结果:

$ hg checkout default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg merge feature1
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
$ hg status -S
  M .hgsubstate
$ hg commit -S -m "branch merge test"
  nothing changed
$ hg branches
   default                       19:c2398dc23428
   feature1                      17:98dc0efbad90 (inactive)

奇怪的是,即使在 module 子存储库中更改了许多文件,但合并仅表示已更新1个文件。我假设这恰好是 .hgsubstate

当我显式更新子库时,我得到以下内容:

$ cd src/module
$ hg update
  39 files updated, 0 files merged, 23 files removed, 0 files unresolved
$ cd ../..
$ hg commit -S -m "feature1 merge"
   committing subrepository src
$ hg status -S
   M .hgsubstate

因此,在执行 hg update 以将所有更改带入工作目录后,我会看到需要提交的 module 子存储库中的更改。但是, .hgsubstate 始终保持修改状态。我试过 hg remove 。我试过 hg忘记了。但无论我做什么,当我执行 hg状态时,它仍然会被标记。

所以我的问题是:

  1. 我采取的程序是否正确合并分支(考虑存在子存储库)?
  2. 是否有必要在子存储库中执行 hg update 以使主存储库识别更改?
  3. 为什么 .hgsubstate 行为不端?

1 个答案:

答案 0 :(得分:2)

您没有说您正在使用哪个版本的hg - subrepo支持随着时间的推移已经改变了一定数量。我刚尝试了类似于你的测试的东西,在hg v2.8中有3个subrepo级别,它对我有用。

当您在顶层获得一个脏的.hgsubstate时,这在提交子参数时是正常的。 [如果只有一个subrepo被独立提交,那么只有.hgsubstate会在顶层变脏。]如果你然后上升到顶级并在该级别提交,则会提交.hgsubstate,一切都很好。请记住,顶级repo以与文件类似的方式跟踪subrepos - 它在每个顶级提交中从subrepo提交特定的变更集。

FWIW。建议的做法是单独提交subrepos,即如果subrepos是脏的,则避免在顶层提交。原因是subrepos通常需要一个不同的提交消息 - 毕竟它们是subrepos的原因;但如果你愿意,你可以在顶层提交。在您的情况下,有3个级别,序列将是:

cd src/module
hg commit -m "src/module commit reason"
cd ..
hg commit -m "src commit reason"
cd ..
hg commit -m "top level reason"

意图是subrepos不经常更改,例如第三方图书馆。如果您的子计划经常发生变化,您和您的团队必须保持警惕以避免错误,特别是在与其他人合作时。 [但考虑到问题的日期,你现在可能已经解决了这个问题。]