いくつかのソリューション間で共有したい共有コードがあります。ほとんどの例ではコマンドラインを使用していますが、Visual Studio2013を使用して実行したいと思います。 (および/またはTortoiseGit)?
- SolutionShared
- .git
- Project1Shared
- Project2Shared
- Solution1
- .git
- ProjectFoo
- ProjectBar
- [SolutionShared]
- [Project1Shared]
- [Project2Shared]
- Solution2
- .git
- ProjectBaz
- ProjectQux
- [SolutionShared]
- [Project1Shared]
- [Project2Shared]
私がしたことは、新しいソリューションSolutionShared
を作成し、そこにすべての共有コードを追加して、それを独自のgitリポジトリに追加することでした。次に、TortoiseGitを使用して(Visual Studioでの実行方法がわからなかったため)、その共有リポジトリをgitサブモジュールとしてSolution1
およびSolution2
に追加しました。
1。Visual Studioで何をしますか?
私の2つのソリューションにSolutionShared
ディレクトリができました。 Visual Studioで2つの子プロジェクト(Project1Shared
とProject2Shared
)を追加するだけですか?
2。非共有プロジェクト内から共有コードを変更するにはどうすればよいですか
非共有ソリューションの1つにいて、サブモジュール内の何かに変更を加えた場合、それをコミットして共有ソリューションのリポジトリ(SolutionShared
)にプッシュバックするにはどうすればよいですか?それを参照するすべてのソリューションで利用できますか?
多くの実験の後...
VSで、サブモジュールからソリューションに共有プロジェクトを追加します。バージョン管理に関しては、親ソリューションの「外部」に存在しているようです。
サブモジュールのプロジェクトを編集すると、それらはローカルになります。それらはコミットされてソースリポジトリにプッシュされる必要があり、次にそれらをそこでマージする必要があります。ソースで変更を加える場合は、それらをソリューションのgitサブモジュールに手動でプルする必要があります。
問題は、VSがこれを行わないため、TortoiseGitまたはコマンドラインを使用する必要があることです。
これを行う最も簡単な方法は、コードの共有ユニットをそれぞれ独自のVisual Studioプロジェクトに移動し、共有された各VisualStudioプロジェクトを独自のリポジトリに配置することです。
次に、それらの各プロジェクトを、それらを必要とするソリューションのサブモジュールとして追加します。私たちのプロジェクトの多くはサイズが非常に大きく、同じコードのチャンクの多くを共有できるため、これは役に立ちます。この目的でもnugetパッケージを広範囲に使用しましたが、一般的に、サブモジュールを使用した方が成功し、設計/デバッグのエクスペリエンスが大幅に向上しました。
過去数年間で、Gitに関連してMicrosoftでは多くの変化がありました。 Visual Studio Team Services(TFS Online)とOn Prem-TFS(TFS2015以降)の両方で、サブモジュールがどのように機能するかを十分に理解し、すぐにサブモジュールを組み込んだCIビルドを実行できるようになりました。
ただし、オンプレミスTFS 2015でのサポートは少しバグが多い場合があります。 TFSビルドのサブモジュールへの参照は破損する傾向があり、障害のあるサブモジュールが完全に削除されて再度追加されるまで、警告なしにビルドが機能しなくなります。これは楽しいプロセスではありません。このため(他にもいくつかありますが)、現在、すべてにVSTS(TFS Online)を使用しており、同じ種類の問題は発生していません。これはオンプレミスのTFS 2017でも修正されていると思います。
前述のように、Visual Studio自体(IDE)は、依然としてサブモジュールの関係を理解するのに苦労しています。それは本当にそれらを処理することはできません。このような環境を管理する最も簡単な方法を見つけるために、いくつかのスタンドアロンGitツールを試しました。 Tortoiseは、サブモジュールを含むリポジトリをプッシュ、プル、およびチェックインするときに、最も簡単でパフォーマンスの高いエクスペリエンスを提供するようです。私は通常、コマンドを使用してサブモジュールを追加しますが、Tortoiseのサブモジュールの追加機能もうまく機能していると思います。
Tortoiseを使用してコードをリポジトリにコミットすると、サブモジュールがダーティであることが通知され、親リポジトリをチェックインする前にサブモジュールをチェックインするように求められます。それは本当にうれしいです。ただし、親リポジトリをプルまたはフェッチすると、少し混乱する可能性があります。リモートブランチからサブモジュールを実際に更新するのではなく、メインリポジトリリモートに現在チェックインされているレベルに更新するだけです。これは常に最新であるとは限りません。実際には、これは望ましい動作であり、予期しない場合はすぐには直感的ではありません。