我正在做一个大型项目,有一个主存储库和多个子存储库,组织如下:
main-repo
sub-a
sub-b
sub-c
每个工作的人都有一个或多个自己的命名分支。我在一个我们将调用的分支中工作,shastings-dev
而一位同事有一个我们将调用的分支coworker-dev
。(这两个分支都存在于main-repo
、sub-a
和sub-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-a
和sub-b
.sub-c
hg 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
而不是我自己的分支。