2013-04-04 20 views

回答

4

Revsets是你的朋友。或者你的剋星,這取決於他們得到多麼複雜:)

以下命令將顯示過去兩年間合併所有相關的變更:

$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge()))" 

那麼複雜一點的表達(我要看看製作簡單,其後)執行以下操作:

  • x:y給你xy之間的所有的變更包括
  • merge()是包含所有合併的revset。
  • last(...,n)給出一組的最後n的變更,與n默認爲1
  • first(...)爲您提供了一組
  • ancestors(last(merge()))的第一變更爲包含上次合併的所有祖先一套

結合所有這些,上面的表達式變成(準備好了):給我所有最後兩次合併中的第一次和最後一次合併(包括最後合併)之間的所有變化集合,它們恰好是最後一次合併的祖先。

ancestors(...)位過濾掉不相關的任何變更。

可以限制這種通過增加& branch(branchname)是在一個特定的分支的變化。例如,如果你是從default合併到release分支,你可以這樣做:

$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge())) & branch(default)" 

這不包括實際的合併本身,因爲它們將出現在release分支。

希望這是有道理的 - 今天下午我會看看我能否得到一個更簡單的方法,但這是第一個想到的問題。在此期間,如果你使用這個,你可以更容易在用戶hgrc文件中創建一個revset別名:

[revsetalias] 
contrib = first(last(merge(),2)):last(merge()) & ancestors(last(merge())) 

那麼你就可以使用:

$ hg log -r "contrib" 
$ hg log -r "contrib & branch(default)" 

欲瞭解更多信息,有一個看看hg help revsets

+0

我不確定這是否正確。我會解釋爲什麼在我的答案中,但也可以自由批評我的答案。 –

+0

@PaulS:看看你的答案,你可能是對的 - 仍然,這是我的一個很好的嘗試:) – icabod

+0

哦,絕對,我偷了一些位來作出我的答案;) –

3

我不知道icabod的解決方案是完全正確的。讓我看看我能否解釋。

讓我們來看看這個變化圖。

o----A1----A2----M1--------A3---M2 
\   /   /
    ---B1----B2---   /
     \     /
     ----C1--------C2----C3 

B是從o截取的分支,C是從B1採取的分支。如果我們在M2和運行icabod的命令,那麼:

  • last(merge())M2
  • first(last(merge(),2))M1

所以表達式變爲:

hg log -r "M1:M2 & ancestors(M2)" 

M1:M2是所做的更改比版本號M1M2之間的版本號whi ch在這種情況下是A3,C2 & C3,其完全忽略C1

我認爲你正在尋找M2的祖先,它們不是M1的祖先。即

hg log -r "ancestors(M2) & not ancestors(M1)" 

hg log -r "ancestors(last(merge())) and not ancestors(first(last(merge(), 2)))" 

我想這應該是C1C2C3 & A3。它還有一個優點,即它不關心如何或何時將變更集添加到回購中。

唯一的問題是如果倒數第二次合併不是最新合併的祖先。我會離開,作爲一個練習留給讀者;-)


當然,所有這一切都可以通過做hg merge --preview(或-P)之前,做了合併是可以避免的,並列出所有的變化當您進行合併時將包含這些集合。

+0

+1主要是提到'合併 - -preview'。讓我想知道在事件發生後是否應該有類似的命令來檢查合併,如果有知道在哪裏停止輸出會很棘手......我想在兩個分支分支的地方。 – icabod

+0

從我的+1也提到合併 - 預覽。很有幫助。通過簡單地更新到合併的第一個父代並對合並的第二個父代執行合併 - 預覽,您應該能夠在合併後獲得相同的信息。 – rationull