2013-10-09 69 views
1

我在一個大型的項目新掌門人,與主倉庫和多個subrepos,這樣的組織:水銀合併創造了subrepos

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)


編輯 - 我在這裏打破了問題,並把答案。對於任何對所有細節真正感興趣的人,問題的其餘部分將完整保留。

的解決方案:對於需要合併,將目錄更改爲subrepo每個subrepo,並按照下列步驟操作:

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

(我沒有這subrepos sub-asub-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錯誤,而不是在我自己的分支。

+0

在合併和提交之後顯示'hg id',就在推送嘗試之前。什麼是變更集'90ce145db695'?同時顯示'hg' – zerkms

+0

'hg log -v -r 90ce145db695' – zerkms

回答

3

爲什麼要創建一個新的頭部?我做錯了什麼,我的分支有什麼問題,還是這種預期的行爲?

你不是在樹枝頭上,所以合併創造一個又一個

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

所以,你需要確保你使用hg idhg 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會做什麼?

+0

謝謝你的幫助。你給我推我需要找到答案,所以我接受這個答案。我會在這個問題上提出細節。 – steveha

+0

你不應該在問題中提出答案,因爲它很混亂(人們可能會認爲接受的答案是正確的答案)。您應該將其添加爲您可以接受的實際答案。如果另一個答案導致您找到正確的解決方案,您可以對它進行投票以表示您的讚賞。 –