2012-04-25 19 views
1

我有一個項目運行在Mercurial下,我發現很多情況下文件需要手動合併,當我相信它應該能夠自動合併。我想知道是否有任何選擇可以讓Mercurial在這些領域提供幫助。Mercurial需要手動合併意外

該項目有一個底層平臺,有幾百個文件,無法在項目中編輯。當平臺更新時,項目會在Mercurial之外獲得這些核心文件的更新版本。我多次看到的順序是:

在中央開發系統(連接到核心平臺更新機制):

  • 獲取核心平臺的新版本。
  • 提交這些更改,例如hg commit -m "New platform release"
  • 推到中央善變服務器

在我的Linux機器:

  • 提交本地更改從中央善變服務器
  • 拉,並嘗試合併
  • 查找合併核心衝突文件

最後兩個核心文件I必須合併,基本和本地版本之間沒有變化(訪問時間在構建期間更新,但內容相同)。唯一的變化是我正在合併的遠程修訂版本。

我知道的唯一的非標準配置是中央mercurial實例在Rhodecode下運行,並提供一個提交掛鉤來更新Redmine存儲庫。

還有什麼可以在mercurial中配置,以幫助它找出合併?

回答

1

您可以重做與--debug的合併以獲取有關合並的更多信息。也就是說,拿你的倉庫做

$ cd .. 
$ hg clone my-project -r 123 -r 456 merge-test 

其中123和456是你要檢查的合併的兩個父母。然後運行

$ hg merge --debug 

看看Mercurial說什麼。它應該是這樣的,如果該文件foo只被在你歸併的分支改變:

$ hg merge --debug 
    searching for copies back to rev 2 
resolving manifests 
overwrite: False, partial: False 
ancestor: 932f5550d0ce, local: b0c286a4a76d+, remote: c491d1593652 
foo: remote is newer -> g 
updating: foo 1/1 files (100.00%) 
getting foo 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

在這裏,我是在修訂b0c286a4a76dc491d1593652合併。

您還可以使用

$ hg status --rev "ancestor(b0c286a4a76d, c491d1593652)" --rev "c491d1593652" 
M foo 
$ hg status --rev "ancestor(b0c286a4a76d, c491d1593652)" --rev "b0c286a4a76d" 
M bar 

仔細檢查哪些文件已被祖先修訂版,你就合併兩家之間的變更改變。上面你看到我在一個分支上更改了foo,另一個分支上了bar

如果你看到一個平臺文件同時出現在狀態列表,以及隨後在東西你的程序出了問題,這可以解釋合併衝突。

如果這還不足以找出問題所在,那麼我建議在Mercurial郵件列表上提出這個問題。這是一個討論的好地方,並且尋找錯誤 - 比Stack Overflow好得多。

+0

太棒了,下次合併出錯時會看到調試輸出。 – asc99c 2012-04-25 16:07:55