2016-08-24 28 views
1

問題:當我更新我的工作目錄從一個修訂到另一個,我想爲每個修訂傳遞一個腳本。我怎樣才能做到這一點?使用Mercurial時,如何在更新時爲每個變更集運行作業?

重要的制約因素

  • 腳本始終是相同的
  • 穿越需要反覆發生(我不想對100個版本做這一切的手...)
  • incoming鉤子是沒有選擇的。它不僅在推或拉之後發生,而且在所有更新中都會發生,無論我在多次修訂之間切換。

爲了說明:

r1(*) -- r2 -- r3 -- r4(head)

基本上,我想要做的

r1(*) --> r2 (then run script) --> r3 (then run script) --> r4 (then...

比方說,我的工作目錄目前是r1,現在我想將其更新爲r4。而不是直接更新(如hg update),我想先更新到r2,然後運行一個腳本(例如update-my-database)。之後我想更新到r3,然後運行相同的腳本等。

+0

你好,你檢查我的答案嗎? –

+0

是的,我想我是。我能做比我更多的事嗎?如果是這樣,我想這樣做。你的回答真的很有幫助。 –

+0

我不認爲你可以做任何事情比接受答案更多。我很高興這有幫助:-) –

回答

1

這是可行的,但我們必須小心從修訂圖中選擇一個線性件。

考慮有兩個頭的最小存儲庫(同樣的事情是,如果兩個分支或兩個書籤):

$ hg log -G --template "{rev}\n" 
o 4 
| 
| o 3 
| | 
| o 2 
|/ 
o 1 
| 
o 0 

說我們從1開始。我們要沿任頭4(所以線狀體去將是:1,4)或沿着頭3(所以線性片將是:1,2,3)。

所以我們將使用兩個參數的腳本:線性塊的開始和結束。

這是裸機,但工程:

for rev in `hg log -r "descendants(1) and ancestors(3)" --template "{rev}\n"` 
do 
    echo Updating to $rev: 
    hg update $rev 
    echo Executing our script: 
    hg id --id --num 
done 

這裏是輸出:

Updating to 1: 
0 files updated, 0 files merged, 2 files removed, 0 files unresolved 
Executing our script: 
4d5aba4313ce 1 
Updating to 2: 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
Executing our script: 
f0de0712ec00 2 
Updating to 3: 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
Executing our script: 
d052bd7c310b 3 

該腳本不管是工作目錄的當前版本。

在開始之前,您必須做hg fetch以從遠程獲取更改,而不將其應用於工作目錄,並且需要了解拓撲並選擇線性塊的起點和終點。

你也必須更換硬編碼13$1$2殼位置參數,並與您的實際腳本替換hg id線:-)

要了解它是如何工作的,我們使用善變的特點(做hg help revsets瞭解更多),它允許在歷史圖上執行查詢(有點像SQL :-)

相關問題