Git リポジトリで大きなファイルを操作する

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022

ソース ファイルには Git、依存関係にはAzure Artifacts、頻繁に変更される大きなバイナリ ファイルには Git LFS を使用します。 リポジトリに既に大きなファイルが含まれている場合、この記事では、Git で保持する内容、移動する内容、履歴からバイナリを削除するタイミングを決定するのに役立ちます。

各ファイルを格納する場所を決定する

リポジトリに既に存在するファイルの対処方法を決定する場合は、ここから開始します。

  • ソース ファイル、スクリプト、テキスト ファイルは Git に保持します。
  • 依存関係と再利用可能なパッケージをAzure Artifacts パッケージ管理に移行します。
  • 頻繁に変更され、あまり相違しない大きなバイナリ ファイルには Git LFS を使用します。
  • 既にチェックインされていて、そこに属しなくなった場合は、リポジトリ履歴から大きなバイナリを削除します。 「リポジトリから大きなファイルを削除する」を参照してください。

リポジトリが既に大きい場合は、ストレージ アプローチを選択する前に、リポジトリを確認し、制限をプッシュします。 大きなリポジトリに影響を与えるファイル、プッシュ、パスの制限に関する Git の制限を参照してください。

Git、パッケージ管理、Git LFS に適したストレージ オプションを選択する

最適な値を選択するには、次の表を使用します。

ファイルの種類またはシナリオ Use
ソース コード、スクリプト、テキスト ファイル Git
依存関係と再利用可能なパッケージ Azure Artifacts パッケージ管理
頻繁に変更される大きなバイナリ ファイル Git LFS
Azure DevOps Server の Git LFS と Kerberos この記事の Kerberos ガイダンスと最後のリンクされた記事を参照してください

Git は、テキスト ベースのソース ファイルや、読み取り可能な小さな増分で変化するその他のコンテンツに最適です。

次の理由から、大きなバイナリは通常の Git ストレージには適していません。

  • Git は、ソース コード、スクリプト、テキスト ファイルのバージョンの違いを効率的に格納します。
  • バージョン間で完全に変更される大きなファイルは、圧縮も差分も適切に行われません。
  • バイナリ ファイルが大きいと、複製、フェッチ、分岐、チェックアウトの時間が長くなります。

バイナリなどの大きな不一致のファイルをリポジトリに追加する場合は、変更をコミットするたびに、それらのファイルの完全なコピーをリポジトリに保持します。 これらのファイルの多くのバージョンがリポジトリに存在する場合、コードのチェックアウト、分岐、フェッチ、複製の時間が大幅に増加します。

Git に属しているファイルはどれですか?

ファイルの種類と変更頻度に合った最も簡単なオプションを使用します。

依存関係ではなく Git でソース コードを保持する

チームが直接編集したファイルには Git を使用します。 依存関係をリポジトリから除外し、 パッケージ管理を通じて提供します。

  • ソース ファイルを Git に配置します。
  • DLL、ライブラリ ファイル、およびその他の依存関係をリポジトリの外部に格納します。
  • パッケージ管理を使用して、依存関係のバージョン管理とデプロイを行います。

パッケージ管理は、パッケージを展開するときに依存関係をバンドルし、システムにファイルをインストールします。 パッケージは、環境に同じパッケージがインストールされている限り、ある環境でテストされたコードが別の環境で同じように実行されるようにバージョン管理されます。

ビルド出力をコミットしない

ビルド出力やテスト成果物ではなく、ソースに Git を使用します。

  • バイナリ、ログ、トレース出力、または診断データをコミットしないでください。
  • 作業項目の追跡またはチーム ファイル共有を使用して、ログとトレース情報を共有します。

Git に小さなバイナリ ファイルを格納する

小さなバイナリ ファイルの変更頻度が低い場合にのみ Git を使用します。

  • 良い例としては、Web イメージ、アイコン、その他の小さなアートアセットなどがあります。
  • これらのファイルを Git に保持すると、チームにとって一貫したワークフローが維持されます。

Important

小さいバイナリでも、頻繁に更新されると問題が発生する可能性があります。 たとえば、100 KB のバイナリ ファイルに対して 100 個の変更では、1 MB のバイナリに対して 10 個の変更と同じ量のストレージが使用されます。 更新の頻度が高いため、バイナリ ファイルが小さいほど、大きなバイナリ ファイルよりも分岐のパフォーマンスが低下します。

頻繁に更新される大きなバイナリアセットを避ける

これらのファイルは多くの場合、バージョン間で変更され、通常は既に圧縮されているため、Git では大規模なバイナリを効率的に格納できません。

  • Git には、各バージョンの完全なコンテンツが格納されます。
  • リポジトリのサイズは時間の経過と同時に大きくなります。
  • 複製、分岐、フェッチ、チェックアウトの操作が遅くなります。

Git は各バージョンの完全なコンテンツを格納する必要があるため、deltification と compression はあまり役に立たない。 これらのファイルが蓄積されると、リポジトリが大きくなり、分岐が遅くなり、複製時間が長くなります。

大きなバイナリ ソース ファイルの戦略

  • 圧縮アーカイブはコミットしないでください。 データの圧縮を解除し、代わりに差分比較可能なソースをコミットしてください。
  • コンパイル済みコードやその他のバイナリ依存関係のコミットは避けてください。 それらをビルドするか、パッケージ管理を使用して提供します。
  • 構成とその他の構造化データを、JSON などの異なるプレーンテキスト形式で格納します。

Git Large File Storage (Git LFS) とは

バージョンによって頻繁に変更され、大きく異なるソース ファイルには 、Git Large File Storage (LFS) を使用します。

Git LFS:

  • 完全なファイルの内容ではなく、リポジトリ内の大きなファイルへのポインターを格納します。
  • バイナリ コンテンツを別のリモート ストレージに格納します。
  • ブランチを複製または切り替えるときに、正しいバージョンをダウンロードします。
  • すべてのクローンとブランチの変更を通じて完全なファイルの内容を移動することなく、大規模なバイナリの通常の Git ワークフローを維持します。

Git LFS の利点

Git LFS は Git ワークフローを維持しながら、大きなファイル コンテンツをメイン リポジトリから移動します。

  • チームは、同じエンド ツー エンドの Git ワークフローを使用し続けることができます。
  • 大きなファイルはメイン リポジトリの履歴から除外されるため、リポジトリを管理しやすくなります。
  • ファイル ロックでは、ビデオ、サウンド、ゲーム マップなど、大きな不一致のアセットでの共有作業がサポートされます。

Azure DevOps Services は Git LFS を完全にサポートし、無料で提供しています。 LFS を使用するには、Git LFS クライアントをインストールし、LFS に格納するファイルの追跡を構成してから、変更をAzure Reposにプッシュします。

Azure DevOps Serverおよび Kerberos 固有のガイダンスについては、Kerberos と Git LFS を参照してください。

Git LFS の制限事項

Git LFS には、事前に考慮しておくべきトレードオフがまだいくつかあります。

  • すべての Git クライアントは、Git LFS クライアントをインストールし、その 追跡構成を理解する必要があります。
  • クライアントが正しくインストールまたは構成されていない場合は、バイナリ ファイルではなくダウンロード ポインター データを複製します。
  • Git では異なるバージョンのバイナリ ファイルをマージできないため、チームメイトは変更を調整する必要があります。
  • Git LFS では ファイルロックが提供されますが、ユーザーは作業を開始する前に最新のコピーをプルする必要があります。
  • Azure Reposは、Git LFS 追跡ファイルを含むリポジトリの Secure Shell (SSH) をサポートしていません。
  • バイナリ ファイルを Web インターフェイスにドラッグすると、LFS ポインターではなく、バイナリがリポジトリにコミットされます。
  • 大規模なアップロードは、使用可能な空き領域、現在のワークロード、および 1 時間のアップロード制限によって制限される可能性があります。

Git LFS ファイル形式

Git LFS 追跡ファイルのリポジトリに書き込むファイルには、各行にキーと値のペアを含む数行があります。

version https://git-lfs.github.com/spec/v1
oid a747cfbbef63fc0a3f5ffca332ae486ee7bf77c1d1b9b2de02e261ef97d085fe
size 4923023

  • バージョン値に含まれる GitHub URL では、LFS ポインター ファイルの種類のみが定義されます。 バイナリ ファイルへのリンクではありません。
  • Azure DevOps Serverを使用する 2.10.0 より前の Git LFS の場合は、Kerberos 認証を使用するために Git LFS 2.10.0 以降にアップグレードします。 現在のガイダンスについては、「Kerberos と Git LFS」および「NTLM ではなく Kerberos を使用するようにAzure DevOps Serverを再構成する」を参照してください。

Azure DevOps Serverと Kerberos の計画

Azure DevOps ServerとWindows認証を使用する場合は、Git LFS を使用するときに Kerberos を計画します。 Git LFS 2.10.0 以降では、Kerberos 認証がサポートされています。

以前のAzure DevOps Serverガイダンスを更新する必要がある場合は、Kerberos と Git LFS とリンクされたAzure DevOps Server認証ガイダンスから始めてください。