我在一個大型的項目新掌門人,與主倉庫和多個subrepos,這樣的組織:水銀合併創造了subrepos
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)
編輯 - 我在這裏打破了問題,並把答案。對於任何對所有細節真正感興趣的人,問題的其餘部分將完整保留。
的解決方案:對於需要合併,將目錄更改爲subrepo每個subrepo,並按照下列步驟操作:
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_branch_name
使。確保它是在頭爲好)
然後,一旦每個subrepo已正確更新,返回包含回購和:
hg commit -m "commit .hgsubstate after merging in subrepos"
hg push
由於這種經歷,我將採取一個新的規則:
如果你有subrepos問題,總是在各個subrepos重試命令。
讓我困惑的是,hg update --clean
切換了所有subrepos,但並沒有實際更新它們。 subrepos的頭部屬於與hg branch
顯示不同的分支。因此,@ zerkms的評論是正確的:subrepos實際上不是的頭上,合併真的是創造了一個新的頭。
換句話說,即使hg id
顯示主回購在頭,這並不意味着subrepos正確更新,也在各自的頭上。單獨檢查subrepos以找出事物的真實狀態。
編輯 - 其餘的原始問題如下。 我的第一個想法是,我本地的回購副本以某種方式混亂。所以我克隆了一個絕對新鮮的回購副本,證實hg pull
沒有帶來任何新東西,並嘗試再次合併/提交/推送。同樣的問題。
我已經嘗試在subrepo中進行合併/提交/推送,然後在主回購庫中進行提交(更新.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: [email protected]_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: [email protected]_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
錯誤,而不是在我自己的分支。
在合併和提交之後顯示'hg id',就在推送嘗試之前。什麼是變更集'90ce145db695'?同時顯示'hg' – zerkms
'hg log -v -r 90ce145db695' – zerkms