2

Mercurial に 50 以上のフィーチャー ブランチがあるとします。私が行った場合:

hg tag some-tag

機能ブランチの 1 つで、すべてのブランチに伝播しているようです。どの機能ブランチにいるかに関係なく、hg tagsすべてのタグが表示されます。それはすべて順調です。しかしhg log、そうすると、変更を含む変更セットが.hgtags特定のブランチで発生したことがわかります。

changeset:   4:ea48c727fbcd
branch:      feat1
tag:         tip
user:        Daniel <xxxx@yyyy.com>
date:        Mon Dec 21 20:15:11 2015 +0100
files:       .hgtags
description:
Added tag feat-1.0 for changeset 3c81a17d4b31

Mercurial はどのよう.hgtagsにすべてのブランチ間で同期を維持していますか? Mercurial Tag Designを読みましたが、詳細については言及されていません。

私が尋ねている理由は、仕事で Mercurial 用の Rhodecode を使用しており、負荷が高いとこの伝播が大幅に遅れるように見えるからです。

.hgtagsファイルに最新のタグが表示されますが、最新のタグが表示されないため、この遅延は非常に厄介ですhg tags。さらに別のタグを実行すると問題が解決する場合があります (Rhodecode のバグかもしれません) が、基になるメカニズムをよりよく理解するために、これがどのように機能するかを知りたいです。

4

1 に答える 1

3

いくつかのドキュメントを引用:

任意の時点で有効なタグは、各ヘッドで指定されたタグです。同じタグが 2 つの異なるヘッドで 2 つの異なるリビジョンを指定する場合、難しいケースが発生します。この問題に対する一般的な「正しい」解決策はありません。

タグの 2 つの定義/変更が無関係と思われる場合...「最も先端」(たとえば、リビジョン番号の数字が大きいもの) が優先されます。
...
ただし、タグが両方のヘッドの共通の祖先で定義されていて、一方のヘッドだけが変更された場合、変更された方が変更されていない方よりも優先されます。

また:

ヘッドが 1 つしかない場合は、タグが表示される最後の行のみが考慮されます。複数のヘッドがある場合、タグの以前の定義を使用して、どのヘッドが最新のタグを保持しているかを判断します.... タグが 00000000000000000000000000000000000000 を指している場合、それは削除されたと見なされます。

私の推測では、解決が必要な複数のブランチに複数のタグがある場合、Mercurial は各変更セットを調べてそのリビジョンを決定し、「最新」を決定する必要があります。変更セットのハッシュとタグ名のみが.hgtags.

于 2015-12-21T21:56:00.513 に答える