Mercurial 3.1のより良い解決策については、Magras deLaManchaによる以下の回答を参照してください。以下は、古いバージョンのMercurial用のよりシンプルでナイーブなソリューションです。
はい、ファイルのカスタムマージツールを構成する必要があり.hgtags
ます。Mercurialには特別なマージツールはありません.hgtags
。通常の3方向マージツールを使用して手動でマージする必要があります。
.hgtags
ファイル内の競合には、次の2つのタイプがあります。
愚かな対立:これはあなたが抱えている状況であり、ここでは実際には対立はありません。何が起こるかというと、1つのブランチが
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
そして他のブランチは
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
979c049974485125e1f9357f6bbe9c1b548a64c3 D
各タグは正確に1つのチェンジセットを参照するため、ここで競合は発生しません。もちろん、マージは2つのファイルの結合である必要があります。
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
979c049974485125e1f9357f6bbe9c1b548a64c3 D
本当の対立: 1つのブランチがあります
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
12e0fdbc57a0be78f0e817fd1d170a3615cd35da C
そして他のブランチは
f40273b0ad7b3a6d3012fd37736d0611f41ecf54 A
0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 B
979c049974485125e1f9357f6bbe9c1b548a64c3 C
ここには実際の競合があります。hg tag C
両方のブランチで実行されましたが、タグは異なるチェンジセットを参照しています。これを解決するのは手動の作業です。
ばかげた競合のみが発生し、チェンジセットごとにタグが1つしかないことを保証できる場合は、次を使用できます。
hg log -r "tagged()" --template "{node} {tags}\n" > .hgtags
新しい.hgtags
ファイルを生成します。重要な洞察は、Mercurialがタグを内部でマージする方法を知っているということです!これは、.hgtags
ファイルが異なる2つのヘッドがある場合に常に実行されます。上記のテンプレートは、.hgtags
この内部マージに基づいて新しいファイルを生成するだけです。
チェンジセットごとに複数のタグがある場合、上記は機能しません。すべてのタグが1行に印刷されるため、2つのタグとfoo bar
の代わりにタグを取得します。その後、代わりにこのスタイルファイルを使用できます。foo
bar
changeset = "{tags}"
tag = "{node} {tag}\n"
チェンジセットではなく、タグごとに1行を出力します。このスタイルをどこかに保存し、マージツールを構成します。
[merge-tools]
hgtags.executable = hg
hgtags.args = log -r "tagged()" --style ~/tmp/tags-style > $output
hgtags.premerge = False
hgtags.priority = -1000
[merge-patterns]
.hgtags = hgtags
これで、自動タグマージができました。いくつかの注意点があります:
3つ以上のヘッド:このテクニックは、マージ時に2つのヘッドがある場合にのみ機能します。ヘッドが3つ以上ある場合は、削除したタグが再表示される可能性があります。ヘッドX、Y、およびZがあり、タグA
がXで削除されている場合、Mercurialは通常、A
全体的に削除されていることを認識できます。これは、X000...0 A
のファイル内の行に基づいて行われ.hgtags
ます。ただし、XとYをマージしてWを取得する場合、提案されたアプローチにはそのような行は含まれません000...0 A
。from Zの定義がA
突然有効になり、再導入されA
ます。
実際の競合:に実際の競合が.hgtags
ある場合、上記の方法では、最新のヘッドからタグがサイレントに選択されます。マージツールは基本的にに保存hg tags
され、複数のヘッドを使用し.hgtags
た場合の動作はwikiで説明されています。すべてのヘッドからファイルを無条件に読み取り、サイレントにマージするため、この単純なアプローチでは何もできません。これに対処するには、2つのファイルを読み取り、競合を検出するより大きなスクリプトが必要になります。hg tags
hg tags
.hgtags
.hgtags