我們正在嘗試運行一個自動將單獨的CVS模塊轉換爲mercurial模塊的chron作業,最後將這些已轉換的mercurial模塊合併到單個mercurial repo中。無論如何自動合併或連接hgtags(Mercurial)?
我一直在試圖找到方法來自動合併.hgtags(從轉換後的hg回購),沒有用戶窗口提示(因此用於時間作業)。
有沒有辦法告訴mercurial使用hg合併只是採取本地文件並將其附加到傳入文件?
感謝任何信息或任何建議
我們正在嘗試運行一個自動將單獨的CVS模塊轉換爲mercurial模塊的chron作業,最後將這些已轉換的mercurial模塊合併到單個mercurial repo中。無論如何自動合併或連接hgtags(Mercurial)?
我一直在試圖找到方法來自動合併.hgtags(從轉換後的hg回購),沒有用戶窗口提示(因此用於時間作業)。
有沒有辦法告訴mercurial使用hg合併只是採取本地文件並將其附加到傳入文件?
感謝任何信息或任何建議
如果您在.hgtags文件有衝突的窗口提示纔會發生,這應該是相當罕見的。但是,這可能是一個可行的想法。
Mercurial允許您使用與內部版本不同的合併工具,有關更多信息,請參閱MergeToolConfiguration。您也可以使用--tool
選項通過命令行更改mergetool(請參閱hg merge --help
)。
也許你可以編寫一些小程序作爲.hgtags的特殊合併工具,它完全符合你的要求,即將本地文件附加到傳入文件。然後,您可以在合併.hg標籤時修改您的hgrc以使用此新工具。
我從來沒有試過這個解決方案,它只是一個想法,但也許它會幫助你。
是的,你可以設置一個像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
這裏是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)
sort -mu
給了我我想要的。該命令不排序,但刪除重複項。
sort -u
中斷時間順序。
在https://stackoverflow.com/a/9783478/1183010的建議:
hgtags.merge.template:變更= 「{}標籤」 的標籤= 「{節點} {標籤} \ n」 個
[合併工具] hgtags .executable =汞柱hgtags.args =登錄-R 「標記()」 --style hgtags.merge.template> $輸出hgtags.premerge =假
[合併圖案] .hgtags = hgtags
適合我們。
出於好奇,您爲什麼要將cvs作業轉換爲CVS repos? –
@Oben:增量轉換。我正在從SVN-> Hg做同樣的事情(減去回購合併)。 –