マルチGB SVNリポジトリをGitに移動する


13

現在、私の会社は、次のように編成されたSVNリポジトリにVisual Studioのソリューションを持っています。

SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
    | -> Tool1
    | -> Tool2

Tool1とTool2は独立してビルドされます(独自のソリューションがあります)が、メインビルドで使用される実行可能ファイルを生成します。ThirdPartyフォルダーには、一部のプリコンパイルされた100 MB以上の.libファイルやboostなどの大きなライブラリなど、プロジェクトのすべての依存関係が含まれています。

(1)開発者が1回のチェックアウトだけを行う必要があり、(2)ビルドの各バージョンに必要な依存関係のバージョンを追跡する必要がないように、すべてを1つのSVNリポジトリに含めると便利です。反対に、このレポを確認するには時間がかかります。

このプロジェクト構造をgitに移動する最良の方法は何でしょうか?おそらく、メインリポジトリからThirdPartyとツールを除外するのが最善ですが、ThirdPartyを1ステップで簡単にダウンロードできるようにして、バージョン管理が必要です(メインリポジトリとThirdParty / Toolsのバージョンの不一致は悪いでしょう)。

この時点では、歴史を保存することには興味がありません。そのようなプロジェクトを整理する方法を理解するだけです。


それらのサイズは、履歴を含むレポジトリ内のサイズを超えていますか、それともローカルの作業コピーのサイズですか?
ドックブラウン14年

1
@DocBrownはローカルの作業コピーであり、履歴は含まれません。
IKH

回答:


10

ジョブに適したツールを使用してください。Windowsでは、それはつまり

サードパーティの依存関係にNuGetを使用する

そうすれば、サードパーティの依存関係をバージョン管理された方法で維持できますが、不要なものでリポジトリを肥大化することはありません。チェックアウトははるかに高速であり、プロジェクトは必要に応じて編成されます。Visual Studioでオプションを有効にすると、常にすべての依存関係が自動的にダウンロードされます。

もちろん、git(別のリポジトリ、サブモジュールなど)を使用するだけのソリューションを使用できますが、それは単なるハックです。正しい方法でそれを行うと、すぐに成果が得られ、将来に備えたシステムが提供されます。

コメント後の編集:NuGetを使用する最良の方法は、共有ドライブまたは完全なNugetサーバーのいずれかにローカルNuGetソースをセットアップすることです。どちらの方法でも、セットアップには数分しかかかりません。そうすることで、どこから来たものであっても、必要なすべてのパッケージが常に利用可能であることを保証できます。


NuGetはコマンドラインビルドをサポートしていますか?私は、ジェンキンスにビルドしてテストしてもらうことができるポータブルビルドを常に探しています。NuGetはJenkinsなどのCIサーバーをサポートしていますか?
uncletall 14年

もう1つ考えて、製品をサポートするのにどれくらいの期間が必要ですか?非常に長い期間サポートを提供する必要がある場合、NuGetで利用できるサードパーティのライブラリの正しいバージョンを期待しません。NuGetなどのツールを使用してサードパーティ製ツールの正しい組み合わせを取得すると、2〜3年後でも非常に大きな問題が発生する可能性があります。
uncletall 14年

3
@uncletall:はい、NuGetには完全なコマンドラインインターフェイスがあります。そして、アイデアは、セットアップにちょうど(、「フィード」と呼ばれるネットワーク共有上のフォルダかもしれローカルNuGetリポジトリ、あるdocs.nuget.org/docs/creating-packages/...
ドク・ブラウン

はい、もちろんローカルミラーを使用すると仮定しました。答えを更新します。
ウィルバート14年

2
@ikh外部依存関係のためにnugetパッケージを構築するのは非常に簡単で簡単です。50個のdllで9つの依存関係をパッケージ化するのに約半日必要でしたが、これまで一度も実行したことがありません。
ウィルバート14年

5

ツールのサブモジュールを使用できます。そうすれば、あなたは今と同じようにサブディレクトリにそれらを保持し、それらをバージョン管理するために別のレポを使用できます。また、ツールのクローンを作成(チェックアウト)して個別に開発でき、他のプロジェクトはそれらのリポジトリに依存し、特定の更新可能なバージョンにも依存する可能性があります。

サードパーティのライブラリにサブモジュールを使用することもできますが、可能な場合は、それらに依存関係マネージャを使用することをお勧めします。


4

gitリポジトリに変換するエンティティは、必ずバージョン管理およびブランチするエンティティです。SolutionFolder/Tools/Tool1そのようなものに対応する場合、それがエンティティのレベルです。SVNでそれを持って(良いアイデアであってもいない)ことも可能であるのに対し、Gitは、バージョン管理エンティティであることをディレクトリツリー全体の状態についてからですtrunkbranchesそしてtags、ツリー内の任意の場所を。

派生したアーティファクトをリポジトリに保存したり、外部ライブラリを保存したりしないでください。これらを処理するより良い方法があります。(Javaを使用している場合は、プライベートMavenリポジトリの使用を検討してください。比較的簡単に使用でき、他の多くのものとうまく統合できます。)

チェックアウトを容易にするためにすべてが1つのリポジトリにあるワークフローに慣れている場合は、代わりに設定を行うスクリプトを用意することを検討してください。


外部ライブラリを管理するためのオプションは何ですか?私たちはC ++とC#を使用してVisual Studioで作業しているため、Mavenはぴったりとは見えません。ここでの主な問題はThirdParty、レポジトリにフォルダがあることは非常に便利であり、適切な代替案を見つけるのは難しいということです。
イフ14年

2
@ikh:Visual Studio環境では、通常、VS 2012以降のバージョンに既に含まれているdocs.nuget.orgの Nugetを使用します。
ドックブラウン14年

2

正直に言うと、私はあなたの設定に何も変更しません。それがまさに私たちが今していることです。私は、使用しているサードパーティのライブラリを処理するために別のgitリポジトリを設定することで遊んでいましたが、移植性のコストが重くなるとは思いません。これで、すべての開発者は、手動のセットアップ手順を実行することなく、チェックアウトして開始できます。ビルドサーバー/スレーブはプロジェクトをビルドできます。複数のリポジトリでサードパーティツールを共有している場合を除き、現在の設定をそのまま使用します。

私が遊んだのは、サードパーティのツールを別のリポジトリにセットアップすることでした。次に、1つの簡単なバッチスクリプトで、sha1 refを含むテキストファイルを読み取り、正しいバージョンをチェックアウトしました。これにより、プロジェクトごとに異なるサードパーティバージョンを使用できます。Facebook Buckビルドツールからこのアイデアを得ました。しかし、結局、多くの開発者はコマンドラインツール(MS VCショップ)を使用することを好まないため、そのアイデアをあきらめました。

(NuGetを使用して)必要なときにサードパーティのライブラリをダウンロードしない主な理由の1つは、製品を長期間サポートする必要がある場合です。私の業界では、古いサードパーティのライブラリに依存する古いバージョンのアップデートをいつか提供する必要があります。アップグレードできるライブラリを選別するのに多くの時間を費やしたくはなく、そのバージョンで使用されているライブラリを使用するだけです。今、NuGetを使用していると想像してください。必要なlibの最新バージョンは3.98ですが、2.04が必要です。彼は小さな変更を期待していたときに最新のライブラリを使用する!


3
私はあなたに+1を与えましたが、「すべてをそのままにする」ことが実用的な解決策であるため、「複数のリポジトリ」だけが問題ではないかもしれないと思います。GitのようなDVCSは、複数のローカルブランチを持ち、各ブランチにすべての完全なローカルコピーを作成することを推奨しています。そのため、ローカルコピーとして同じ大きなサードパーティライブラリ(通常は同じバージョン)を複数回使用することになります。これは状況によっては実現可能かもしれませんが、他の状況では、これが分岐やマージのパフォーマンスに悪影響を及ぼすと想像できます。
Doc Brown 14年

私の知る限り、ブランチはGitで非常に安価な操作であり、ポインターを作成するだけで、スペースをほとんど使用しません。
uncletall 14年


何かが足りない限り、ブランチはGitで「無料」です。.git / refs / headsを確認したところ、すべてのブランチは1KBのテキストファイルで、.git / logs / refs / headにはマスターの最大サイズが11KBのログが含まれています。通常のプロジェクト構造は約500MBサードパーティのライブラリおよびその他のツール。私はブランチを作成するための1キロバイトのヒットを取ることがとても幸せです
uncletall

1
@MichaelT:ブランチ自体はもちろん無料ですが、ローカルワークステーションに異なるブランチの複数の作業コピーが並行して存在する状況について話します。元の質問の下のコメントを確認すると、OPは作業コピーのサイズとして3GBのサードパーティツールを参照していました。
ドックブラウン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.