2009-04-29 66 views
8

當與Mercurial進行合併時,它希望合併衝突的文件,而這種衝突的文件在大型合併集上不是一個高效的工作流。相反,我想要做的是合併兩個頭的整個變更集(比如使用kdiff3來比較兩個頭)。對我來說聽起來很簡單,但我無法弄清楚如何實現它。我該如何做一個基於變更集的合併而不是基於文件的Mercurial合併?

到目前爲止,我能得到的最接近的是通過合併通常的方式,將所有衝突解決(一次一個文件...),然後hg vdiff -rHead1 -rHead2 - 但vdiff(使用kdiff3)doesn' t看起來可以選擇傳遞工具的輸出目錄(當前工作目錄),而是以輸出目錄作爲tempdir啓動(可能-o是答案?)。

讓我換一種方式 - 我想用kdiff將兩個頭合併到我的工作目錄中。我希望我的工作目錄中的結果成爲我可以提交的合併結果。

我必須錯過一些明顯的東西,我不能是唯一一個想要做到這一點的人。

+0

我對這個問題的措辭有點困惑。 Mercurial中的變更集是不變的歷史片段;這裏IIUC你想要一次合併整個文件樹而不是逐個文件。 – 2014-04-03 06:24:08

回答

0

嘗試設置ui.merge。有關更多詳細信息,請參閱this page

+0

也許我的問題還不夠清楚 - 無論ui.merge設置如何,我仍然會從mercurial獲取一次一次的文件合併,而不是整個變更集合與變更集合合(除非我失蹤) – jsaylor 2009-04-29 23:15:51

+0

我還是有點困惑 - 你還不需要kdiff一次顯示一個衝突的文件嗎?還是可以解決所有的衝突而無需人工干預? – 2009-04-30 17:29:01

1

我認爲this可以解答你的問題。

+0

好文章,但我仍然只想合併正面(而不是中分支的變更集)。我的問題在這一點上並不完全清楚。 – jsaylor 2009-06-17 13:22:39

3

幾天前,我在irc.freenode.net上將問題轉發給#mercurialmpm(Mercurial的作者)給了一個答案(這只是一半的答案,所以我沒有立即在這裏傳遞它)。他說,如果你讓Mercurial自動合併這些文件(並在有衝突的地方插入<<<<>>>>合併標記),可能會做一些事情。

然後使用一個知道這些標記的合併工具:這將讓你一次解決它們,而不是逐個文件地完成它。起點將是merge tool configuration上的頁面。它解釋了

 
[ui] 
merge = internal:merge 

將使Mercurial插入合併標記。在這裏我通過製作兩個文件x.txty.txt來測試它,然後我在兩個克隆中修改了衝突變化。合併只是給了:

 
% hg merge 
merging x.txt 
warning: conflicts during merge. 
merging x.txt failed! 
merging y.txt 
warning: conflicts during merge. 
merging y.txt failed! 
0 files updated, 0 files merged, 0 files removed, 2 files unresolved 
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon 

所有的文件一次處理,我不必確認每個文件,如你所描述的任何東西。

,文件現在包含合併標記是這樣的:

% cat x.txt 
foo 
<<<<<<< local 
hehe 
======= 
foobar 
>>>>>>> other 

下一步是找到一個工具,可以採取這樣的文件的目錄樹,讓你解決這些問題。我看着kdiff3,但沒有弄清楚如何使用它來單獨操作一個文件,它似乎非常專注於比較文件/目錄對。

我不知道這半個答案對您有多大幫助 - 也許您在這一點上也陷入了困境?但我希望它可以幫助其他人想要將合併標記插入到所有文件中,然後手動解決衝突。

+0

你很接近讓未解決的文件存在的概念。我想我想出了一個更完整的答案,但是使用了我剛纔發佈的這個策略。 – jsaylor 2009-06-17 13:25:22

+0

我很高興你至少找到了實現它的方法,儘管它不是一個完美的方式。我可以做一個擴展,使工作流程更好,但我很少合併我自己,我不會寫它:-) – 2009-06-18 07:51:33

0

聽起來像你想的extdiff命令:在我的〜/

我有這些。hgrc(我喜歡MELD,但你可以改變它kdiff3等)

[extensions] 
hgext.extdiff = 

[extdiff] 
# add new command called meld, runs meld (no need to name twice) 
cmd.meld = 

隨着extdiff您的合併發生在你的工作目錄,而且你可以傳遞任何額外的參數,以您的diff程序使用-o:

$ hg help extdiff 

汞柱extdiff [OPT] ... [FILE] ...

利用外部程序來diff的 存儲庫(或選定的文件)

Show differences between revisions for the specified files, using 
an external program. The default program used is diff, with 
default options "-Npru". 

To select a different program, use the -p option. The program 
will be passed the names of two directories to compare. To pass 
additional options to the program, use the -o option. These will 
be passed before the names of the directories to compare. 

When two revision arguments are given, then changes are 
shown between those revisions. If only one revision is 
specified then that revision is compared to the working 
directory, and, when no revisions are specified, the 
working directory files are compared to its parent. 

選項:

-p --program比較程序運行
-o --option pass選項比較程序
-r --rev修訂
-I --include包括姓名匹配給定模式
-X --exclude排除名稱匹配給定模式

4

我想出了實現我想要什麼,但我還是覺得一個解決方案像它是一個雜食。

  • 從一個空的工作目錄開始,有2個頭:我的和他們的。
  • 更新到煤礦工作目錄:
    hg update [My head's rev here]
  • 執行合併,但不能說芝加哥商業交易所不能沒有啓動合併工具會自動處理所有文件並保存「我的」文件衝突時:
    hg --config "ui.merge=internal:fail" merge

有關如何合併/失敗的詳細信息,請參見https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742

現在我已經有一個工作目錄,儘可能多的汽車可以弄清楚,但任何優秀的文件仍然未觸及我的。 (使用汞決心-l來查看當前文件的Mercurial的分辨率狀態)

  • 現在我可以VDIFF我的工作目錄對他們的頭,它給了我很高的水平,變更對變更合併,我一直在尋找對於。

hg vdiff -r [Theirs head's rev here]

注:如果您使用的WinMerge您vdiffs,然後確保它有一個/ R開關作爲一個選項,它會做一個子目錄比較和 - 如果配置的WinMerge被設置爲使用樹視圖 - 將給出一個偉大的樹的比較。從Mercurial.ini:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

現在我可以工作的整個目錄包括尚未解決的文件,使項目範圍必要的更改(即可能解決一個文件需要在另一個額外的變化)。

  • 完成後使用解決標記爲Merc解決所有文件,然後提交。
    hg resolve -m

哎!希望這可以幫助別人!