1

我正在做一个大型项目,有一个主存储库和多个子存储库,组织如下:

main-repo
    sub-a
    sub-b
    sub-c

每个工作的人都有一个或多个自己的命名分支。我在一个我们将调用的分支中工作,shastings-dev而一位同事有一个我们将调用的分支coworker-dev。(这两个分支都存在于main-reposub-asub-b中;都不存在于sub-c并且我们都在使用其他人的分支。)

coworker-dev我的问题是,如果不以某种方式创建新头,我就无法再合并更改。这一系列命令具有意想不到的效果:

hg pull
hg branch # prints: shastings-dev
hg merge --tool internal:other coworker-dev
hg commit -m "merge coworker-dev" --subrepos
hg push

hg push打印此消息 :abort: push creates new remote head 945a60694252 on branch 'shastings-dev'! (in subrepo sub-a)


编辑——我在这里打破问题并给出答案。对于真正对所有细节感兴趣的人,其余的问题将在下面保持不变。

解决方案:对于需要合并的每个子存储库,将目录更改为子存储库并按照以下步骤操作:

hg update --clean shastings-dev
hg merge --tool internal:other coworker-dev
hg commit -m "merge coworker-dev"
hg push

(我为subrepossub-asub-b.sub-chg update correct_branch_name

然后,一旦每个子存储库都被正确更新,返回到包含的存储库,并且:

hg commit -m "commit .hgsubstate after merging in subrepos"
hg push

由于这次经历,我将采用一条新规则:

如果您对子存储库有问题,请始终重试各个子存储库中的命令。

让我感到困惑的是,它hg update --clean切换了所有子存储库,但实际上并没有更新它们。subrepos 的头部属于不同的分支,而不是显示为 的分支hg branch。结果,@zerkms 的评论是正确的:子存储库实际上不在头部,合并确实在创建一个新的头部。

换句话说,即使hg id显示主存储库处于领先地位,但这并不意味着子存储库已正确更新并且也处于各自的领先地位。单独检查子存储库以找出事物的真实状态。


编辑——原始问题的其余部分如下。我的第一个想法是我的本地回购副本不知何故被打乱了。所以我克隆了一个绝对新鲜的 repo 副本,验证了它hg pull没有带来任何新的东西,并再次尝试了合并/提交/推送。同样的问题。

我尝试在子存储库中执行合并/提交/推送,然后在主存储库中执行提交(更新.hgsubstate),然后在主存储库中执行合并/提交/推送。没有喜悦。

我曾尝试在 Windows 上使用 TortoiseHg 来克隆存储库,更新到分支shastings-dev,然后合并/提交/推送。同样的问题。

所以现在我的问题:

  • 为什么要创建一个新的头部?我做错了什么,我的分支是否有问题,或者这是预期的行为?

  • 我应该怎么办?我可以消除这个多头问题,还是应该用 推动-f然后关闭两个头中较旧的一个hg commit --close-branch

  • 如果我使用 可能会发生什么不好的事情hg push -f?我个人的规则是“除非你是 Mercurial 专家,否则不要这样做”,而我不是 Mercurial 专家。(所以我实际的个人规则是“永远不要使用hg push -f.”)

顺便说一句,我没有处理同事正在处理的任何文件。目前,我与分支只有细微差别coworker-dev,我愿意完全失去分支上的所有历史记录shastings-dev,只要我能获得一个具有相同名称的最新分支。(如果我丢失了更改,我愿意再次复制更改的文件。我只是希望 Mercurial 再次按预期工作。)

编辑:当我执行上述操作时,我在一个分支头上。

$ hg heads
changeset:   1515:803ea844dc8a
branch:      coworker2-dev
tag:         tip
user:        coworker2
date:        Tue Oct 08 17:33:31 2013 -0700
files:       .hgsubstate
description:
Fixed some stuff in the foo bar.


changeset:   1513:1e76e6a43d83
branch:      coworker-dev
parent:      1509:5e5392aded0a
user:        coworker@place_where_i_work.com
date:        Tue Oct 08 16:44:04 2013 -0700
files:       foo.java bar.java baz.java quux.java
description:
Added more support to the foo bar for release.


changeset:   1422:8705d62db8f2
branch:      shastings-dev
user:        shastings@place_where_i_work.com
date:        Wed Oct 02 21:08:39 2013 -0700
files:       .hgsubstate
description:
Finish adding files

...many others not copied here...
$ hg id
8705d62db8f2 (shastings-dev)

$ hg update --clean shastings-dev
resolving manifests
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ hg id
8705d62db8f2 (shastings-dev)

$ hg merge --tool internal:other coworker-dev
...much output not copied here...

$ hg commit -m "merge coworker-dev" --subrepos
...much output not copied here...

$ hg push
pushing to https://path/to/repo/dir/main-repo
pushing subrepo sub-a to https://path/to/repo/dir/sub-a
searching for changes
new remote heads on branch 'shastings-dev'
new remote head 85d8faada6c4
new remote head 90ce145db695
abort: push creates new remote head 85d8faada6c4 on branch 'shastings-dev'! (in subrepo sub-a)
(you should pull and merge or use push -f to force)

正如我所说,当我遇到问题时,我重新克隆了所有内容。所以状态是干净的:我没有修改过的文件。

另外,我还有一个分支,我用另一个分支尝试了上述顺序。正如描述的那样,它又发生了。所以,如果有什么问题,我认为它一定是分支错误,coworker-dev而不是我自己的分支。

4

1 回答 1

3

为什么要创建一个新的头部?我做错了什么,我的分支是否有问题,或者这是预期的行为?

你不在分支头上,所以合并创建另一个

-- A (you're here) --- B --- C (head #1)
    \
      D (merge, head #2)

所以你需要确保你在使用hg idand时处于领先地位hg heads。如果没有 -hg up

我应该怎么办?我可以消除这个多头问题,还是应该用 -f 推动,然后用 hg commit --close-branch 关闭两个头中较旧的一个?

你应该解决真正的问题。请参阅上面的建议

如果我使用 hg push -f 会发生什么坏事?我个人的规则是“除非你是 Mercurial 专家,否则不要这样做”,而我不是 Mercurial 专家。(所以我实际的个人规则是“永远不要使用 hg push -f。”)

我个人的规则是 - 永远不要使用-f. 经过 4 年的 mercurial 经验,我完全没有理由使用它。可能会发生什么 - 一旦有 2 个头,会hg up branchname做什么?会hg up做什么?

于 2013-10-09T23:06:05.970 回答