Version control Mercurial merge在subrepos中创建新的head
我正在从事一个大型项目,有一个主存储库和多个子存储库,组织方式如下:Version control Mercurial merge在subrepos中创建新的head,version-control,mercurial,Version Control,Mercurial,我正在从事一个大型项目,有一个主存储库和多个子存储库,组织方式如下: main-repo sub-a sub-b sub-c 每个工作人员都有自己的一个或多个命名分支。我在一个我们称之为shastings-dev的分支机构工作,一个同事有一个我们称之为coworker-dev的分支机构。(这两个分支机构都存在于main repo、sub-a和sub-b中;都不存在于sub-c中,我们都在使用其他人的分支机构。) 我的问题是,我不能再合并来自同事dev的更改而不创建新的头
main-repo
sub-a
sub-b
sub-c
每个工作人员都有自己的一个或多个命名分支。我在一个我们称之为shastings-dev
的分支机构工作,一个同事有一个我们称之为coworker-dev
的分支机构。(这两个分支机构都存在于main repo
、sub-a
和sub-b
中;都不存在于sub-c
中,我们都在使用其他人的分支机构。)
我的问题是,我不能再合并来自同事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推送
打印此消息:
abort:push在分支“shastings dev”上创建新的远程磁头945a60694252!(在subrepo sub-a中)
编辑--我在这里打断问题并给出答案。问题的其余部分将在下面完整地留给真正对所有细节感兴趣的人 解决方案:对于每个需要合并的子repo,将目录更改为子repo,并执行以下步骤:
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\u branch\u name
,以确保它也位于头部。)
然后,在正确更新每个子回购协议后,返回包含子回购协议的子回购协议,并:
hg commit -m "commit .hgsubstate after merging in subrepos"
hg push
根据这一经验,我将采用一条新规则:
如果子repo有问题,请始终重试各个子repo中的命令。
让我困惑的是,hg update--clean
切换了所有子回购,但实际上没有更新它们。次级回购协议的头属于不同的分支,而不是显示为hg branch
的分支。因此,@zerkms的评论是正确的:子回购协议实际上并不在头上,合并实际上是在创造一个新的头
换言之,即使hg id显示主回购处于领先地位,但这并不意味着子回购也处于相应的领先地位。逐个检查子回购协议,以了解实际情况
编辑——下面是原始问题的其余部分。 我的第一个想法是,我当地的回购协议不知怎么搞砸了。因此,我克隆了一份全新的回购协议副本,验证了
hg pull
没有带来任何新内容,并再次尝试了合并/提交/推送。同样的问题
我曾尝试在子repo中执行合并/提交/推送,然后在主repo中执行提交(更新.hgsubstate
),然后在主repo中执行合并/提交/推送。没有快乐
我曾尝试在Windows上使用TortoiseHg克隆repo,更新到branchshastings dev
,然后合并/提交/推送。同样的问题
现在我的问题是:
- 为什么要创建一个新的头部?我是否做错了什么,我的分支是否有问题,或者这是预期的行为
- 我该怎么办?我可以消除这个多头问题吗,或者我应该用
推动,然后用-f
关闭两个头中较旧的头吗hg commit--close branch
- 如果我使用
,会发生什么不好的事情?我的个人规则是“除非你是个善变的专家,否则不要那样做”,而我不是善变的专家。(所以我的实际个人规则是“永远不要使用hg push-f
)hg push-f
同事开发人员
只有细微的区别,我愿意完全丢失分支shastings开发人员
的所有历史记录,只要我能得到一个同名的工作最新分支。(如果我丢失了更改,我愿意重新复制更改的文件。我只希望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)
正如我所说,当我遇到问题时,我会重新克隆一切。所以状态是干净的:我没有修改过的文件
另外,我还有一个分支,我用另一个分支尝试了上面的序列。正如所描述的那样,事情又发生了。所以,如果有什么不对劲,我想它一定是在分支同事dev
中出错了,而不是在我自己的分支中
为什么要创建一个新的头部?我是否做错了什么,我的分支是否有问题,或者这是预期的行为
您不在分支头上,因此“合并”将创建另一个分支头
-- A (you're here) --- B --- C (head #1)
\
D (merge, head #2)
因此,您需要使用hgid
和hgheads
确保您处于头部。如果没有-hg up
我该怎么办?我可以消除这个多头问题吗,或者我应该用-f推动,然后用hgcommit--close分支关闭两个头中较早的一个
你应该解决真正的问题。见上面的建议
如果我使用hg push-f,会发生什么不好的事情?我的个人规则是“除非你是个善变的专家,否则不要那样做”,而我不是善变的专家。(所以我个人的实际规则是“永远不要使用hg-push-f”)
我的个人规则是——永远不要使用
-f
。在使用mercurial 4年之后,我觉得没有任何理由使用它。可能发生的情况-只要有两个头部,hg up branchname会做什么?在合并和提交之后,就在推送尝试之前,hg-up
会做什么?显示hg-id
。什么是变更集90ce145db695
?在中显示hg以及hg log-v-r 90ce145db695
感谢您的帮助。你给了我找到答案的动力,所以我接受这个答案。我会把细节放在问题中。你不应该把答案放在问题中,因为它令人困惑(人们可能会认为被接受的答案是正确的答案)。你应该加上