状況
2 つの .NET ソリューション (Foo
およびBar
) と、ProjectA、ProjectB、および ProjectC を含む共通ライブラリがあります。Foo
およびBar
1 つ以上のライブラリ プロジェクトを参照していますが、ライブラリ プロジェクトがFoo
およびBar
ソリューション フォルダー内にありません。
ディレクトリ構造:
-- My Documents*
-- Development
-- Libraries
-- ProjectA
-- ProjectB
-- ProjectC
-- Projects
-- Foo
-- Solution
-- .hg
-- .hgignore
-- Foo { Project Folder }
-- FooTests { Project Folder }
-- Foo.sln { References ProjectA }
-- Foo.suo
-- Bar
-- Solution
-- .hg
-- .hgignore
-- Bar { Project Folder }
-- BarTests { Project Folder }
-- Bar.sln { References ProjectA and ProjectB }
-- Bar.suo
*残念ながら、私はまだ Windows XP を使用しています...
Mercurial サブリポジトリ
目標Foo
- サブリポジトリを設定して、参照されているライブラリ プロジェクトのソース コードを自分のリポジトリとリポジトリに保存できるようにしたいと考えていBar
ます。
このページ(文字通り、サブレポで見つけることができる唯一のドキュメントです) によると、サブレポを設定するには、DOS コンソール ウィンドウから次のコマンドを実行する必要があります。
1| $ hg init main
2| $ cd main
3| $ hg init nested
4| $ echo test > nested/foo
5| $ hg -R nested add nested/foo
6| $ echo nested = nested > .hgsub
7| $ hg add .hgsub
8| $ ci -m "initial commit"
質問
- バージョン 0.9.2 の時点で、これらの手順の一部またはすべてを TortoiseHG で実行できますか? はいの場合、どのように?1〜3行目はできると確信していますが、4〜7行目についてはわかりません。これはどれも TortoiseHG で文書化されていないようです。
- 上記のコードは何をしますか (行ごとの説明をいただければ幸いです)。私がそれを解読しようとしていたときに頭に浮かんだいくつかの具体的な質問を次に示します。
- 何をし
>
ますか?Mercurial のドキュメントで を検索してみまし>
たが、何も見つかりませんでした。 - 5行目、何が何だかわかりません
nested/foo
。どこfoo
から来たの?とはfoo
? リポジトリ?フォルダー? - 6 行目 - これには完全に困惑します。
- 7 行目で、 ?
.hgsub
に追加されていると仮定します。main
それとも追加されていnested
ますか?
- 何をし
- サブリポジトリがセットアップされ、
Bar
リポジトリがリビジョン 10 になったとします。作業ディレクトリをリビジョン 7 に更新しようとすると、ライブラリ フォルダー (My Documents/Development/Libraries/ProjectA
および.../Libraries/ProjectB
) がリビジョン 7 に保存されているものに更新されます。良い?
アップデート
コードの 8 行目を追加しました: ci -m "initial commit"
. これにより、(1) .hgsubstate ファイルがメイン リポジトリに追加され、(2) 新しいサブリポジトリを含むすべての変更がメイン リポジトリにコミットされます (「初期コミット」というメッセージが表示されます)。.hgsubstate ファイルの目的は、すべてのサブリポジトリの状態を追跡することです。そのため、以前のリビジョンに戻ると、すべてのサブリポジトリからも正しいリビジョンが取得されます。
更新 2 - いくつかの指示
さらに実験を重ねた結果、元の問題を解決するための手順を提供できるようになったと思います(主に Windows Explorer と TortoiseHG を使用)。
サブレポの作成
Libraries/ProjectA
、Libraries/ProjectB
、およびメイン リポジトリ (Projects/Foo/Solution
およびProjects/Bar/Solution
) は、個別のリポジトリである必要があります。- 開く
Projects/Foo/Solution
。 Libraries/ProjectA
からにクローンしProjects/Foo/Solution
ます。- リポジトリに追加
ProjectA
します。Foo
テキスト エディタを使用して
.hgsub
、次の内容を含むというファイルを作成します。ProjectA = ProjectA
DOS コンソール ウィンドウを開き、次のコマンドを入力します(以下の注を参照)。
cd c:\...\Projects\Foo\Solution hg ci -m "Committing subrepo "ProjectA"
の場合
Bar
、手順は基本的に同じですが、.hgsub ファイルには次のように両方のプロジェクトのエントリが含まれている必要があります。ProjectA = ProjectA ProjectB = ProjectB
注: TortoiseHG 0.10 (3 月に予定) から、これを行うためにシェル コマンドを使用できるようになりますHG Commit
が、今のところ、コマンド ラインを使用する必要があります。
これがすべて設定されると、少し簡単になります。
変更のコミット-Foo
またはへの変更をコミットするには、サブリポジトリごとに操作をBar
実行しSynchronize/Pull
て、サブリポジトリをライブラリ プロジェクト リポジトリの最新のリビジョンと同期させます。次に、再度コマンドラインを使用して変更をコミットします (バージョン 0.10 までは、TortoiseHG を使用してコミットするだけです)。
作業ディレクトリを以前のリビジョンに更新する- これは TortoiseHG でかなり正常に動作するようで、DOS コマンドを使用する必要はないようです。Synchronize/Push
Visual Studio で以前のリビジョンを実際に操作するには、古いバージョンのライブラリ プロジェクトをLibraries/ProjectX
フォルダーに戻す操作を行う必要があります。
単純なタスクには TortoiseHG が好きですが、頻繁に使用されるサブリポジトリ操作 (特に更新) にはバッチ ファイルを作成する方がよいでしょう。
これが将来誰かに役立つことを願っています。間違いを見つけた場合は、お知らせください (または、編集できる場合は自由に編集してください)。