3

このレポ構造を取ります:

Server (main repo)
    ProjectA (subrepo)
    SharedLibrary (subrepo)

Client (main repo)
    ProjectB (subrepo)
    SharedLibrary (subrepo)

SharedLibraryは同じフォルダー(これはWindows)を指し、各メインリポジトリの下にある個別のコピー/クローンではありません。

各メインリポジトリに0と1(ヒント)の2つのチェンジセットがあると仮定します。1(ヒント)リビジョンの両方のメインリポジトリから開始します。

次の手順を実行します。

  1. クライアントリポジトリで、チェンジセット0に更新します。これにより、ProjectBとSharedLibraryが以前の一致するリビジョンに更新されます。

  2. ProjectAはSharedLibraryと同期していません。ステップ1は、SharedLibraryをProjectAに必要なリビジョンよりも古いリビジョンに更新しました。これはまだ1(ヒント)です。

  3. サーバーリポジトリでは、SharedLibraryをProjectAの正しいリビジョンに更新する必要があるため、サーバーメインリポジトリでhgupdatetipを実行します。これにより、SharedLibraryが正しいリビジョンに更新されません。これにより、SharedLibraryはステップ1と同じリビジョンのままになります。

  4. クライアントリポジトリに戻り、hgupdatetipを実行します。SharedLibraryは、ProjectAとProjectBの両方で正しいリビジョンになりました。

サーバーリポジトリでの更新は、SharedLibraryが正しいリビジョンであるかどうかを確認していないようです。この動作は予想されますか、それともこれを行うためのより良い方法がありますか?

4

1 に答える 1

2

あなたが見ているのは、作業コピーが汚れているときにhg updateマージされるということです。まず、通常のファイルで説明します。2つのリビジョンを持つリポジトリがあると想像してください。私はリビジョン0にいて、foo変更されています:

$ hg diff
diff --git a/foo b/foo
--- a/foo
+++ b/foo
@@ -1,3 +1,3 @@
 first
 second
-third
+third line

3行目を変更しました。ここで、実行するhg update 1と、変更はリビジョン1のようにマージされます。foo

$ hg update 1
merging foo
0 files updated, 1 files merged, 0 files removed, 0 files unresolved

変更はまだあり、fooまだ汚れています:

$ hg diff
diff --git a/foo b/foo
--- a/foo
+++ b/foo
@@ -1,3 +1,3 @@
 first line
 second
-third
+third line

あなたがしたとき

$ cd client
$ hg update 0

のリビジョン0でSharedLibrary説明されているリビジョンに更新されていることを確認しました。.hgsubstateclient

次にに移動するserverと、サブリポジトリは、のリビジョン1SharedLibrary説明したリビジョンではなくなりました。言い換えると、の作業コピーがダーティでした—新しいファイルがコミットされる結果になります。.hgsubstateserverserverhg commit.hgsubstate

Mercurialは、アクセス時にこの変更を保持します。これが、更新時に最新にされていないことがわかる理由です。サブリポジトリを最新にしたい場合に使用します。hg updateserverSharedLibraryhg update -C

この機能の背後にある考え方は、サブリポジトリのさまざまなバージョンをテストできることです。バグを探すときは、メインリポジトリを古いバージョンに更新する必要があることが多いため、サブリポジトリのリビジョンへの変更をそのままにしておくと便利です。

表示されている混乱した状況は、同じサブリポジトリを2回再利用したことが原因ではないことに注意してください。ただし、Lasseが指摘しているように、複数のプロジェクトで単一のサブリポジトリを使用する実際の方法は、サーバーに1回配置してから、ローカルクローンにクローンを作成することです(クローンごとに1) 。

これについて詳しく説明しましたが、簡単に言うと、推奨事項に従い、サーバーとクライアントの両方で同じ構造を維持する必要があります。この構造を維持するには、ファイル内SharedLibrary = SharedLibraryのパスを使用してください。.hgsubサーバー側でリポジトリをリンクして(他の回答を参照)、単一のリポジトリを複数の異なるURL/ディレクトリの下に表示します。

サブリポジトリから始めるときは、密結合に注意してください。可能であれば、JavaベースのプロジェクトにはMaven+Nexusなどの適切な依存関係管理システムを使用してみてください。

于 2012-03-12T17:08:33.003 に答える