大きなバイナリファイルを含むGitリポジトリを最適化する


21

私たちのプロジェクトは約11GBで、そのうち10個はバイナリデータ(.png画像)です。その結果、a git diffまたはgit status操作は1分以上かかります。幸いなことに、すべてのデータファイルは素晴らしい名前のフォルダに分けられていますdata。割り当ては、「バイナリファイルの圧縮、差分、およびその他のコストのかかる操作を避けます」です。

  • プロジェクトを2つのリポジトリに分割することを検討しました。次にdata、外部リポジトリになり、メインのソースコードリポジトリによってチェックアウトされます。特にデータファイルを操作するアーティストにとって、リポジトリの同期を維持するオーバーヘッドは大きすぎると判断されました。

  • gitにこれらのファイルを明示的にバイナリ伝え、差分からファイルを除外することを検討しましたが、これらは質問に対する部分的な解決策にすぎないようです。

git属性が解決策だと思いますが、どうやって?または、モノリシックリポジトリよりも優れたアーキテクチャがありますか?


1
ここでの最初の大きな質問は、これらのデータファイルがどれほど重要かということです。あなたのプログラムは、何か有用なことをするために利用可能なこれらの画像のすべてを必要としますか、それとも典型的な開発/テスト中に小さなサブセットで逃げることができますか?
Ixrec

@Ixrec、画像は実際にはソースコードよりも重要です。それらはすべて存在する必要があり、破損したファイルについては.pngチェックサムが常にチェックされます。
ヴォラック

1
スタックオーバーフローに関するこの質問がないのはなぜですか?Q.それにぴったりのようです。
spirc

@spircこの質問は、SOで話題になっている「ソフトウェアツールのヘルプ」と、ここで話題になっている「バージョン管理戦略」の間の行にまたがっています。何を実行するためにどのgitコマンドを実行するかを尋ねているわけではないので、行のSO側には明確ではないので、ここで開いたままにしておくことに投票しました。

@スノーマンは応答に感謝します。トピックリストのどの項目が該当しますか?Programmers.stackexchange.com/help/on-topic
spirc

回答:


18

git-lfsまたは同様のツール(git-fat、git-annexなど)を使用できます。これらのツールは基本的に、リポジトリ内のバイナリファイルをハッシュ付きの小さなテキストファイルに置き換え、実際のバイナリデータをネットワーク共有のような非gitの方法で保存します。

ハッシュのみが比較されるので、差分とすべてが超高速になり、少なくともgit-lfsの場合、ユーザーに対して透過的です(一度インストールした後)。

Afaik git-lfsはgithub、gitlab、VisualStudioでサポートされており、オープンソースです。


2
git-lfs開発者/アーティストが混在するチームで、数ギガバイトの資産を持つプロジェクトで使用してみましたか?人々がゲームやアニメーションなどのプロジェクトにgit-lfsを使用しているかどうかを知りたいです。執筆時点ではまだかなり新しいので。私自身の経験からすると、あまり技術のないユーザーに対するgitへの参入の障壁はすでに非常に高いため、その上にファイル管理のための追加のレイヤーを用意することは、すでにgitに慣れていない人にとって使いにくいかもしれません。
-ideasman42

最大約1GBのデータのみ、申し訳ありません。しかし、git-lfsはエンドユーザーに追加のステップを追加するべきではなく、完全に透過的でなければなりません。
kat0r

統合中に問題が発生した場合、これは正しい答えのようです。ここで報告します。したがって、インストール手順は、各クライアントマシンではなく、サーバーで1回だけ完了する必要がありますか?
ヴォラック

小さなクライアントアドインもインストールする必要があるので、githubページを確認してください。ただし、グループポリシーを使用して簡単に展開でき、他の方法よりも簡単です。
kat0r

1

GITとSVNの両方のリポジトリを使用する

バイナリファイルをソースから論理的に分離できる場合は、テキストファイルにはgitを使用し、バイナリファイルにはsubversionなどの非DVCSを使用することを検討できます。

私が取り組んでいるプロジェクトはこれを行います。コンパイル済みライブラリ(OSX / Win32依存関係用)に多くのGBがあり、バージョン管理を維持する必要があるためです。


一方、技術に詳しくないユーザーがいる場合、2つのバージョン管理システムを使用すると問題が発生する可能性があります。ただし、アーティストがコードに取り組んでいない場合は、更新を実行するためのスクリプトを提供し、subversionを使用してバイナリアセットをコミットできます。

SVNを使用します(でgit svn

このトレードオフは、通常のgitを使用することに慣れている開発者にとって必ずしも良いとは限りませんが、メインリポジトリにSVNを使用でき、開発者はgit svnツールを使用できます。

これにより、gitを使用する開発者にとってはもう少し手間がかかりますが、DVCS(またはVCS全般)に精通していない人にとっては意味があります- 複数の複雑なバージョン管理システムを使用せずにSVNの単純なモデルを使用できます。


git-lfsもオプションですが、私はそれを使用しなかったので、どれだけうまく機能するかについて話すことができません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.