6

個別の CVS モジュールを mercurial モジュールに自動的に変換し、最終的にそれらの変換された mercurial モジュールを 1 つの mercurial リポジトリに統合する chron ジョブを実行しようとしています。

ユーザー ウィンドウ プロンプトを表示せずに .hgtags を (変換された hg リポジトリから) 自動的にマージする方法を探していました (つまり、cron ジョブでの使用)。

hg mergeを使用してローカル ファイルを取得し、それを受信ファイルに追加する 場合に Mercurial に通知する方法はありますか?

情報や提案をありがとう

4

5 に答える 5

8

はい、 Krtekが説明するようなマージツールを設定できます。私はそれを試してみましたが、これは機能します:

[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あり、2番目の引数はマージするバージョンです。

2つのファイルに共通する行の重複を避けるために、出力を並べ替えて一意にします。タグを追加するだけで問題なく機能しますが、タグも削除すると、.hgtagsファイル内の行の順序が重要になるため、このように並べ替えることはできません。この状況に対処するための私の拡張回答を参照してください。

これは私のテストセッションです。まず、2つのヘッドを持つリポジトリを作成します。

$ 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拡張機能からの出力に表示されます。

@  changeset:   4:54c5397a23a4
|  tag:         tip
|  user:        Martin Geisler <mg@aragost.com>
|  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 <mg@aragost.com>
|  date:        Wed Mar 02 11:45:17 2011 +0100
|  summary:     c
|
| o  changeset:   2:a9af8514a64e
| |  user:        Martin Geisler <mg@aragost.com>
| |  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 <mg@aragost.com>
|    date:        Wed Mar 02 11:44:44 2011 +0100
|    summary:     b
|
o  changeset:   0:0db5fae8b6cc
   user:        Martin Geisler <mg@aragost.com>
   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
于 2011-03-02T10:59:26.470 に答える
3

sort -mu私が欲しいものをくれた。このコマンドはソートしませんが、重複を削除します。

sort -u時間の順序を破る。

于 2012-10-08T13:02:46.157 に答える
2

ウィンドウ プロンプトは、.hgtags ファイルに競合がある場合にのみ発生しますが、これは非常にまれです。しかし、ここにおそらくうまくいくアイデアがあります。

Mercurial では、内部ツールとは異なるマージ ツールを使用できます。詳細については、MergeToolConfigurationを参照してください。オプションを使用して、コマンド ラインから mergetool を変更することもでき--toolます (「 」を参照hg merge --help)。

おそらく、.hgtags の特別なマージ ツールとして機能する小さなプログラムを作成することができます。これは、ローカル ファイルを着信ファイルに追加するなど、まさに必要なことを行います。その後、hgrc を変更して、.hgtag をマージするときにこの新しいツールを使用できます。

私はこの解決策を試したことはありません。これは単なるアイデアですが、役立つかもしれません。

于 2011-03-01T16:54:02.263 に答える
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)
于 2011-11-24T07:25:47.390 に答える
0

https://stackoverflow.com/a/9783478/1183010の提案:

hgtags.merge.template: changeset = "{tags}" tag = "{node} {tag}\n"

[merge-tools] hgtags.executable = hg hgtags.args = log -r "tagged()" --style hgtags.merge.template > $output hgtags.premerge = False

[マージパターン] .hgtags = hgtags

私たちのために働きます。

于 2013-03-20T13:00:32.997 に答える