2011-03-01 17 views
6

我們正在嘗試運行一個自動將單獨的CVS模塊轉換爲mercurial模塊的chron作業,最後將這些已轉換的mercurial模塊合併到單個mercurial repo中。無論如何自動合併或連接hgtags(Mercurial)?

我一直在試圖找到方法來自動合併.hgtags(從轉換後的hg回購),沒有用戶窗口提示(因此用於時間作業)。

有沒有辦法告訴mercurial使用hg合併只是採取本地文件並將其附加到傳入文件?

感謝任何信息或任何建議

+1

出於好奇,您爲什麼要將cvs作業轉換爲CVS repos? –

+0

@Oben:增量轉換。我正在從SVN-> Hg做同樣的事情(減去回購合併)。 –

回答

2

如果您在.hgtags文件有衝突的窗口提示纔會發生,這應該是相當罕見的。但是,這可能是一個可行的想法。

Mercurial允許您使用與內部版本不同的合併工具,有關更多信息,請參閱MergeToolConfiguration。您也可以使用--tool選項通過命令行更改mergetool(請參閱hg merge --help)。

也許你可以編寫一些小程序作爲.hgtags的特殊合併工具,它完全符合你的要求,即將本地文件附加到傳入文件。然後,您可以在合併.hg標籤時修改您的hgrc以使用此新工具。

我從來沒有試過這個解決方案,它只是一個想法,但也許它會幫助你。

8

是的,你可以設置一個像Krtek描述的merge tool。我只是想出來,這個作品:

[merge-tools] 
merge-tags.executable = cat 
merge-tags.args = $local $other | sort -u >> $output 

[merge-patterns] 
.hgtags = merge-tags 

假如把它放在你的.hg/hgrc文件在服務器上,將來合併將只是追加的標籤。什麼情況是,hg merge將執行

cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags 

,其中的第一個參數cat.hgtags文件的本地版本,第二個參數是你與合併的版本。

我對輸出進行排序並使其唯一,以避免重複這兩個文件中常見的行。只要你只添加標籤,這將工作正常 - 但如果你也刪除標籤,那麼.hgtags文件中的行順序很重要,所以你不能只是這樣排序。 請參閱my extended answer處理這種情況。

這是我的測試環節。我開始通過使倉庫有兩個頭:

$ hg init 
$ echo a > a.txt 
$ hg add a.txt 
$ hg commit -m a 
$ echo b > b.txt 
$ hg add b.txt 
$ hg commit -m b 
$ hg tag b 
$ hg update 0 
0 files updated, 0 files merged, 2 files removed, 0 files unresolved 
$ echo c > c.txt 
$ hg add c.txt 
$ hg commit -m c 
created new head   
$ hg tag c 

分支是從graphlog extension輸出可見:

@ changeset: 4:54c5397a23a4 
| tag:   tip 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:20 2011 +0100 
| summary:  Added tag c for changeset aff5fe9be7d9 
| 
o changeset: 3:aff5fe9be7d9 
| tag:   c 
| parent:  0:0db5fae8b6cc 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:17 2011 +0100 
| summary:  c 
| 
| o changeset: 2:a9af8514a64e 
| | user:  Martin Geisler <[email protected]> 
| | date:  Wed Mar 02 11:45:02 2011 +0100 
| | summary:  Added tag b for changeset 0518533f37f6 
| | 
| o changeset: 1:0518533f37f6 
|/ tag:   b 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:44:44 2011 +0100 
| summary:  b 
| 
o changeset: 0:0db5fae8b6cc 
    user:  Martin Geisler <[email protected]> 
    date:  Wed Mar 02 11:44:33 2011 +0100 
    summary:  a 

有一個在.hgtags文件有衝突:

$ hg cat -r 2 .hgtags 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
$ hg cat -r 4 .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 

但合併仍爲非交互式:

$ hg merge 
merging .hgtags 
1 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

你可以看到這些文件被附加:

$ cat .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
+0

謝謝,這看起來像這可能是解決方案 – DavidW

+2

這可能會在Windows中完成? –

+0

@NickHodges我寫了一個基本的C#exe文件,可以用來替代Windows上的cat:https://bitbucket.org/janverley/hgtagsmerger/ – jan

1

這裏是Python中的簡單合併工具。它還會嘗試維護.hgtags文件中的行的現有順序。

同樣的注意事項適用於馬丁的答案。

import sys 
from heapq import merge 

local = sys.argv[1] 
other = sys.argv[2] 
output = sys.argv[3] 

merged_tags = merge(file(local).readlines(), file(other).readlines()) 

unique_tags = [] 
for tag in merged_tags: 
    if tag not in unique_tags: 
     unique_tags.append(tag) 

file(output, 'w').writelines(unique_tags) 
3

sort -mu給了我我想要的。該命令不排序,但刪除重複項。

sort -u中斷時間順序。

0

https://stackoverflow.com/a/9783478/1183010的建議:

hgtags.merge.template:變更= 「{}標籤」 的標籤= 「{節點} {標籤} \ n」 個

[合併工具] hgtags .executable =汞柱hgtags.args =登錄-R 「標記()」 --style hgtags.merge.template> $輸出hgtags.premerge =假

[合併圖案] .hgtags = hgtags

適合我們。