Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control Mercurial merge在subrepos中创建新的head_Version Control_Mercurial - Fatal编程技术网

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
(我这样做是为了subrepos
sub-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,更新到branch
shastings 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
感谢您的帮助。你给了我找到答案的动力,所以我接受这个答案。我会把细节放在问题中。你不应该把答案放在问题中,因为它令人困惑(人们可能会认为被接受的答案是正确的答案)。你应该加上