web-dev-qa-db-ja.com

VisualStudioでgitサブモジュールを使用するためのワークフロー

いくつかのソリューション間で共有したい共有コードがあります。ほとんどの例ではコマンドラインを使用していますが、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つの子プロジェクト(Project1SharedProject2Shared)を追加するだけですか?

2。非共有プロジェクト内から共有コードを変更するにはどうすればよいですか
非共有ソリューションの1つにいて、サブモジュール内の何かに変更を加えた場合、それをコミットして共有ソリューションのリポジトリ(SolutionShared)にプッシュバックするにはどうすればよいですか?それを参照するすべてのソリューションで利用できますか?

15
h bob

多くの実験の後...

VSで、サブモジュールからソリューションに共有プロジェクトを追加します。バージョン管理に関しては、親ソリューションの「外部」に存在しているようです。

サブモジュールのプロジェクトを編集すると、それらはローカルになります。それらはコミットされてソースリポジトリにプッシュされる必要があり、次にそれらをそこでマージする必要があります。ソースで変更を加える場合は、それらをソリューションのgitサブモジュールに手動でプルする必要があります。

問題は、VSがこれを行わないため、TortoiseGitまたはコマンドラインを使用する必要があることです。

8
h bob

これを行う最も簡単な方法は、コードの共有ユニットをそれぞれ独自の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を使用してコードをリポジトリにコミットすると、サブモジュールがダーティであることが通知され、親リポジトリをチェックインする前にサブモジュールをチェックインするように求められます。それは本当にうれしいです。ただし、親リポジトリをプルまたはフェッチすると、少し混乱する可能性があります。リモートブランチからサブモジュールを実際に更新するのではなく、メインリポジトリリモートに現在チェックインされているレベルに更新するだけです。これは常に最新であるとは限りません。実際には、これは望ましい動作であり、予期しない場合はすぐには直感的ではありません。

8
CRender