2

Rudi's answer to this questionで説明されているベンダー デフォルトのブランチ スキームにほぼ従って、サードパーティ コードを追跡するために Mercurial リポジトリをセットアップしています。特定のバージョンをすばやく取得するために、各ベンダーとデフォルト バージョンのタグを作成します。

空の .hgtags をコミットしてデフォルト ブランチを確立しhg branch vendor、最初のバージョンをインポートしてリポジトリを初期化します。新しいバージョンを追加するプロセスは次のようになります。

hg up -C vendor
... load new version ...
hg commit -A -m "Adding version x.y.x"
hg tag vendor-x.y.z
hg up -C default
hg merge vendor
hg commit -m "Merging version x.y.z"
hg tag x.y.z

マージ中は常に .hgtags のローカル コピーを保持するため、ベンダー ブランチにはすべての vendor-xyz タグを含む .hgtags があり、デフォルト ブランチの .hgtags には xyz タグしかありません。

Mercurial は、タグを操作するときにすべてのヘッドから .hgtags を考慮することを理解しています。しかし、実行するhg tagsと、結果にはヒントと xyz タグのみが含まれます。これは、作業ディレクトリがどのブランチに更新されても同じです。これは常に、デフォルトのブランチ .hgtags ファイルのタグです。

vendor-xyz タグに更新できるので、Mercurial はそれらの存在を認識しますが、更新により、ベンダー ブランチのヒントからコードが得られるようです。xyz タグは正常に機能します。

私はこれまで主に Git と SVN/CVS を扱ってきたので、これは理解の問題であり、技術的な問題ではないと思います。念のため、Mercurial の 2 つのバージョン (2.0.2 と 2.3.2) で試してみましたが、同じ結果が得られました。

4

1 に答える 1

1

私は確認するために Mercurial システムの前にいるわけではありませんが、問題は Mercurial がブランチ ヘッドではなく、トポロジ ヘッドからの .hgtags のみを考慮することだと思います。例:

[1]---[2]---[5]---[6]    Default
        \         /
         [3]---[4]       Vendor

[6] はトポロジカル ヘッド、[4] と [6] はブランチ ヘッドです。解決策は、マージ時に .hgtags へのすべての変更を保持することです。

編集

これが私のテストです。マージの直後に、ローカルの .hgtags を受け入れ、hg tagsタグのみを に表示しましたdefault。表示されているものとは異なり、ベンダー タグを更新できません。Mercurial 2.3.1 を使用しています。vendor で別の変更セットを作成し、2 つ目のトポロジ ヘッドを作成すると、欠落しているタグが再び表示されます。

hg init test
cd test
echo >a
hg ci -Am 1
hg branch vendor
echo >b
hg ci -Am 2
hg tag v1
hg update default
hg tag d1
hg merge vendor --tool internal:local
hg ci -m Merge

@REM This only shows 'tip' and 'd1'
hg tags

hg update vendor
hg tags
hg update d1

@REM This fails to update.
hg update v1

@ Add another topological head by committing to vendor
hg update vendor
echo >c
hg ci -Am 3

@ Now all tags are visible and work.
hg tags
hg update v1
hg update d1

そして出力:

C:\>hg init test
C:\>cd test
C:\test>echo  1>a
C:\test>hg ci -Am 1
adding a
C:\test>hg branch vendor
marked working directory as branch vendor
(branches are permanent and global, did you want a bookmark?)
C:\test>echo  1>b
C:\test>hg ci -Am 2
adding b
C:\test>hg tag v1
C:\test>hg update default
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg tag d1
C:\test>hg merge vendor --tool internal:local
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
C:\test>hg ci -m Merge
C:\test>hg tags
tip                                4:80759c41b3cc
d1                                 0:17b05ed457d1
C:\test>hg update vendor
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
C:\test>hg tags
tip                                4:80759c41b3cc
d1                                 0:17b05ed457d1
C:\test>hg update d1
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg update v1
abort: unknown revision 'v1'!
C:\test>hg update vendor
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
C:\test>echo  1>c
C:\test>hg ci -Am 3
adding c
C:\test>hg tags
tip                                5:a2c0fe73a9f1
v1                                 1:3168d0f4e5e5
d1                                 0:17b05ed457d1
C:\test>hg update v1
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
C:\test>hg update d1
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
于 2012-10-09T12:33:47.103 に答える