2013-03-15 55 views
4

我正在編寫代碼來分析我們對Hg的提交,並將我的結果與TortoiseHg進行比較。我無法理解TortoiseHg在合併情況下的行爲。合併中顯示的TortoiseHg文件

當我在TortoiseHg中選擇合併變更集時,受影響的文件列表僅顯示那些衝突的文件,除非我按下"Show All"按鈕。至少這似乎是我的意圖,基於我可以從網上搜集的內容,以及觀察到如果按下「全部顯示」按鈕,列表中顯示的文件具有雙向箭頭。

我試圖通過對照父母雙方對變更集中的每個文件進行比較來仿效,並且只在我的分析中包括該文件,如果它與父母雙方不同。但是,我遇到TortoiseHg在合併描述中顯示的文件,但這些文件僅與一位父母不同。我在TortoiseHg中也看到 - 與父級1或2的差異會顯示更改,但另一個父級不會。

我也嘗試使用--git選項進行區分,以確保它不是我缺少的元數據更改,但這根本不會改變結果。

要獲得我使用的是變更的信息:

hg log -v -r <rev> --removed --style xml 

我拿起合併變更的父母,並在合併的每個文件,做

hg diff -r <parent1> -r <rev> filename 
hg diff -r <parent2> -r <rev< filename 

我發現文件TortoiseHg在其合併報告摘要中顯示爲合併爲沒有衝突。

任何人都可以闡明這種差異嗎?

更新: 我能夠使用TortoiseHg本身的源代碼重現此問題。

https://hg01.codeplex.com/tortoisehg克隆 打開tortoiseHg的回購並選擇rev 12602(58eb7c70)。這是與12599(6c716caa)和12601(39c95a81)的父母合併。

TortoiseHg顯示文件tortoisehg/hgqt/repowidget.py作爲合併的唯一衝突的文件,但

hg diff -r 12599 -r 12602 tortoisehg/hgqt/repowidget.py 

回報什麼,而

hg diff -r 12601 -r 12602 tortoisehg/hgqt/repowidget.py 

顯示兩行改變。

+0

您的存儲庫是公開的嗎?有一些真實的數據來看待會更容易。 – kevingessner 2013-03-15 22:27:26

+0

可悲的是,但我會看看我是否可以在公開回購問題上重新創建問題 – 2013-03-15 23:35:23

回答

2

我想我已經想出了什麼tortoisehg的邏輯在這裏(雖然我沒有檢查源確定)。

正如你所猜測的,烏龜顯示文件在雙向箭頭合併兩側發生了變化。然而,它並不是簡單地看待每個父母的合併差異(例如,p1(58eb7c70)::58eb7c70p2(58eb7c70)::58eb7c70)。相反,烏龜發現合併中引入的所有變化,比較兩個父母的最後共同祖先。

讓我們以烏龜回購爲例。的58eb7c70祖先的圖形視圖是:

Jonathan:tortoisehg $ hg log --graph -r ::58eb7c70 -l 5 --template "{node|short}\n{desc|firstline}\n\n" 
o 58eb7c70d501 
|\ Merge with stable (noop) 
| | 
| o 39c95a813105 
| | repowidget: show all errors on infobar 
| | 
| o da7ff15b4b96 
| | repowidget: limit infobar error messages to 2 lines of up to 140 chars by default 
| | 
o | 6c716caa11fd 
|\| Merge with stable 
| | 
| o 48c055ad634f 
| | sync: show non-ascii command-line arguments correctly 
| | 

正如你所看到的,合併58eb7c70d501合併發展的兩個分支,與一側的一個變更(P1,6c716caa11fd),但另一方面( p2,39c95a813105及其父母,da7ff15b4b96)。這些分支發散的點是p1和p2 - 48c055ad634f的最後一個共同祖先。

(最後的共同祖先可以直接與hg log -r "last(ancestor(p1(58eb7c70), p2(58eb7c70)))"找到)

讓我們來看看那些兩個分支中所做的更改。我們將比較合併的每個父母與共同祖先:

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::6c716caa11fd" 
M .hgtags 
M tortoisehg/hgqt/commit.py 
M tortoisehg/hgqt/compress.py 
M tortoisehg/hgqt/hgemail.py 
M tortoisehg/hgqt/postreview.py 
M tortoisehg/hgqt/purge.py 
M tortoisehg/hgqt/rename.py 
M tortoisehg/hgqt/repowidget.py 
M tortoisehg/hgqt/revset.py 
M tortoisehg/hgqt/run.py 
M tortoisehg/hgqt/settings.py 
M tortoisehg/hgqt/status.py 
M tortoisehg/hgqt/sync.py 
M tortoisehg/hgqt/visdiff.py 
M tortoisehg/util/cachethg.py 
M tortoisehg/util/hglib.py 

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::39c95a813105" 
M tortoisehg/hgqt/repowidget.py 

這些是實際上是由58eb7c70d501融合的改變 - 在兩個分支改變,因爲他們分道揚鑣的一切。如您所見,列表中唯一共享的文件(在兩個分支上更改的唯一文件)爲tortoisehg/hgqt/repowidget.py,正如您所期望的那樣。您會看到該文件在da7ff15b4b96中已更改,該變更集不是合併的父項,但仍包含在從兩個分支合併的更改中。

+0

這很有道理。非常感謝您的深入分析。現在我知道如何在我自己的代碼中重新創建這個邏輯。不勝感激。 – 2013-03-17 16:57:27

0

tortoisehg/hgqt/repowidget.py已在6c716caa11fd中修改,這可以解釋爲什麼您第二次致電hg diff會給出結果;第一次調用比較兩個修改,其中沒有更改註冊到tortoisehg/hgqt/repowidget.py;這聽起來對我來說很合理,除非我對hg diff的行爲方式缺少其他信息。

+0

差異行爲對我來說很有意義。我試圖弄清楚爲什麼烏龜將這個文件標記爲在合併的每一邊都有變化(即衝突)。我最感興趣的是試圖複製烏龜的行爲,以便我們對我們的提交和合並所作的分析將給出和烏龜一樣的答案。只是基於差異,我會說文件合併沒有衝突。 – 2013-03-16 17:46:49