2013-03-29 41 views
0

我正在研究開源項目中的合併研究。如何查找Mercurial存儲庫中存在衝突的所有合併?

我最近問了How can I find all the commits that have multiple parents in a Mercurial repository?,得到了很好的答案。

現在我需要縮小我的查詢來找到發生衝突的提交。

有衝突我的意思是在兩個貢獻的提交中修改了相同的文件。

另外,如果我可以找到一個mercurial或bash(grep,awk?)命令,那麼這將非常有用,它只給出那些由兩個貢獻者修改相同行的提交。

這個想法是找到無法自動解析的提交。

那麼,我如何才能找到Mercurial存儲庫中存在衝突的所有合併?

+0

如果有人有興趣,我也問過同樣的問題Git:http://stackoverflow.com/questions/15707769/how-can-i-find-all-the-merges-that-had-conflicts- in-a-git-repository – macrobug

+1

只需發佈一些示例輸入和期望輸出以及文本轉換的解釋,而無需參考特定於域的術語(例如「合併」,「提交」,「父母」,「衝突」 「mercurial」可能或者不代表任何東西,或者對許多人來說可能意味着許多事情)。如果你能做到這一點,你很可能會得到一個很好的答案,而不是你希望其他人去閱讀一堆舊帖子,試圖弄清楚你的問題是什麼。 –

+0

夠公平的Ed。 「提交」是其他版本控制系統稱爲修訂或變更集的內容,它們是相關變更的原子單位。提交的「父」是另一個立即在其之前提交的提交。 「合併」是指有多個父母的提交。當兩個父母修改同一行代碼時會發生「衝突」。 「Mercurial」是一個分佈式版本控制系統。示例輸入:任何相當大小的開源mercurial倉庫(我有很多這些)。 示例輸出:提交ID列表(例如15691597c1bd120b0b393a9577c183121ea72c2e) – macrobug

回答

1

對於每個合併版本,您都可以檢索相對於第一個和第二個父版本的已更改文件的列表。出現在兩個列表中的文件大概是衝突。

這裏有一個例子:

for rev in $(hg log -r "merge()" --template '{rev}\n'); do 
    hg status --rev "p1($rev)" --rev $rev --no-status | sort > /tmp/p1 
    hg status --rev "p2($rev)" --rev $rev --no-status | sort > /tmp/p2 
    echo Conflicts in $rev: 
    comm -1 -2 /tmp/p1 /tmp/p2 
done 

注:這可能不會有文件被重命名處理。您可以嘗試在「hg status」呼叫中添加「--copies」。

+0

謝謝西蒙!我修改了你的答案,使用散列而不是整數ID。 – macrobug

2

沒有簡單的方法可以找到這些,因爲合併中沒有記錄任何內容來指示合併是否存在衝突。

注意,在兩個分支修改的文件並不一定構成衝突,只會導致衝突,如果該文件是:

  1. 無法合併(即二進制或類似)
  2. 或者文件中的至少一個區域在兩個分支中都發生了更改

如果在一個分支中更改文件的頂部,而另一箇中的底部更改並且它們距離彼此足夠遠(通常爲變化之間的幾條線就足夠了),那麼這個將合併而不會發生衝突。

您唯一的選擇是重播包含兩個分支中已更改的文件的每個合併,從而記錄mercurial無法合併且沒有衝突的合併。

此外,我不知道有任何方式使用內置查詢語法來查找兩個分支中相同文件已更改的合併。我想你必須自己去挖掘日誌(也就是用一些代碼)。

+2

*你唯一的選擇是重播每個合併[...] [我的答案](http://stackoverflow.com/a/15712119/1600898)到[問題的git變體](http:// stackoverflow .com/q/15707769/1600898)實施這種方法。 OP似乎正在尋找mercurial的等效代碼。 – user4815162342

0

您可以使用這些過濾器來隔離所有合併文件及其父母。但是,你需要區分父母,看看是否存在合併衝突。

0
  1. 是的,你要重播合併父母
  2. 之間的每一個合併的合併

成功返回0,1的合併檢查返回代碼後,如果有未解決的文件。

相關問題