Back

Git Subrepoを使用した大規模コードベースの管理

Git Subrepoを使用した大規模コードベースの管理

フロントエンドチームが複数のリポジトリにまたがってユーティリティライブラリやUIコンポーネントを共有する場合、根本的な問題に直面します。ワークフローの摩擦を生じさせることなく、共有コードの同期をどのように保つかということです。Gitサブモジュールは存在しますが、その複雑さで開発者を悩ませます。Gitサブツリーは機能しますが、マージ戦略によっては、上流への貢献を複雑にする方法で履歴を圧縮してしまう可能性があります。

ここでgit-subrepoのようなサードパーティツールが、Gitで共有コードを管理するための代替アプローチを提供します。これは外部リポジトリをコードベースに直接埋め込みながら、よりクリーンな開発者体験を目指すものです。

重要なポイント

  • Git subrepoはサードパーティツールであり、Gitの組み込み機能ではありません。外部リポジトリを通常のファイルとして埋め込むことで、サブモジュールと比較してクローンやオンボーディングを簡素化します。
  • サブモジュール(正確なコミット固定、複雑なワークフロー)とサブツリー(マージされた履歴、設定可能な保存)の中間に位置し、実用的な中間点を提供します。
  • このツールは、共有内部パッケージ、フォークされた依存関係、大規模コードベースにおける段階的なモノレポ移行に適しています。
  • git-subrepoの採用には、CIツールのインストール、プル時の履歴圧縮、コミュニティメンテナンスへの依存といったトレードオフが伴います。

Git Subrepoとは何か(そして何でないか)

Git subrepoはGitの組み込み機能ではありません。これは、Gitで依存関係をベンダリングするためのGitサブモジュールやサブツリーベースのワークフローの代替手段を提供する、コミュニティメンテナンスのツールです。このツールは外部リポジトリをプロジェクトのサブディレクトリにクローンし、特別なGit設定を必要とせず、.gitrepoファイルでメタデータを追跡します。

サブモジュールとは異なり、貢献者はクローン後に追加のコマンドを実行する必要がありません。埋め込まれたコードはリポジトリ内の通常のファイルとして存在します。サブツリーとは異なり、使用方法によって上流の履歴を保持または圧縮できますが、git-subrepoは上流の関係を別途追跡し、デフォルトではプル時に上流の変更を圧縮します。

Git Subrepo vs サブモジュール vs サブツリー

トレードオフを理解することで、チームに適したアプローチを選択できます。

側面GitサブモジュールGitサブツリーGit Subrepo
統合モデル外部コミットへのポインタリポジトリにマージ通常のファイルとしてクローン
履歴の扱い分離、リンク圧縮または保持通常プル時に圧縮、メタデータで追跡
クローン動作--recurse-submodulesが必要通常通り動作通常通り動作
上流同期手動チェックアウト更新サブツリーのpull/pushSubrepoのpull/push
CI再現性慎重な設定が必要一般的に信頼性が高いツールのインストールが必要

サブモジュールは、正確なコミット固定が必要で、チームがワークフローを理解している場合に適しています。チームは最新のGitバージョンを使用し、再帰的なサブモジュール初期化で信頼できないリポジトリをクローンすることは避けるべきです。再帰的パターンは、不注意に使用された場合、歴史的にセキュリティ上の懸念を引き起こしてきました。

サブツリーは外部コードを直接マージするため、クローンは簡素化されますが、上流への変更の貢献がより複雑になる可能性があります。履歴は、選択した戦略に応じて完全に保持されるか、圧縮されます。

Git subrepoはこれらのアプローチの中間に位置します。git-subrepoワークフローは、外部コードを通常のファイルとして保持しながら、メタデータで上流の関係を追跡します。これによりオンボーディングが簡素化されますが、同期操作にはツールのインストールが必要です。

Git Subrepoが適している場合

git-subrepoワークフローは、大規模コードベースにおける特定のシナリオに適合します。

共有内部パッケージ: 複数のアプリケーションが共有コンポーネントライブラリを使用する場合、git-subrepoを使用すると、各チームがライブラリをベンダリングしながら、上流に修正をプッシュする能力を維持できます。

フォークされた依存関係: オープンソースライブラリのパッチ版を維持している場合、git-subrepoはサブモジュールの煩雑さなしにフォーク関係を追跡します。

段階的なモノレポ移行: モノレポに移行するチームは、git-subrepoを使用してリポジトリを段階的に統合できます。

考慮すべきトレードオフ

Git subrepoは普遍的に優れているわけではありません。独自の複雑さをもたらします。

マージコンフリクト: リポジトリと上流の両方が同じファイルを変更した場合、コンフリクトの解決には両方のコードベースの理解が必要です。これはすべての埋め込みアプローチに当てはまり、git-subrepoはこれを排除しません。

履歴の保存: デフォルトでは、git-subrepoはプル時に上流のコミットを圧縮します。完全なコミット履歴が必要な場合は、圧縮なしのサブツリーの方が適している可能性があります。

CIの考慮事項: ビルドパイプラインで同期操作を実行するには、git-subrepoがインストールされている必要があります。これは、組み込みのGitコマンドを使用するサブモジュールやサブツリーが回避する依存関係を追加します。

メンテナンス負担: サードパーティツールとして、git-subrepoはコミュニティメンテナンスに依存しています。チームがサポートの潜在的なギャップに対処できるかどうか、プロジェクトの活動レベルが長期的なニーズを満たすかどうかを評価してください。

基本的なGit-Subrepoワークフロー

git-subrepoをインストールした後、コアコマンドは簡単です。

# 外部リポジトリをサブディレクトリにクローン
git subrepo clone https://github.com/your-org/shared-utils packages/utils

# 上流の変更をプル
git subrepo pull packages/utils

# ローカルの変更を上流にプッシュ
git subrepo push packages/utils

各subrepoディレクトリ内の.gitrepoファイルは、上流のURL、ブランチ、最後に同期されたコミットを追跡します。

結論

Git subrepoは、サブモジュールが複雑すぎると感じられ、サブツリーワークフローが貢献モデルに適合しない場合に、Gitで共有コードを管理するための実用的な中間点を提供します。特に、リポジトリ間で内部パッケージをベンダリングするフロントエンドチームに適しています。

採用する前に、CIパイプラインがツールの依存関係に対応できるか、チームの同期パターンが組み込みの代替手段よりもこのアプローチを正当化するかどうかを評価してください。適切な選択は、履歴の保存、上流への貢献、開発者のオンボーディングに関する特定の制約によって異なります。

よくある質問

はい。git-subrepoは外部コードを通常のファイルとして埋め込むため、コードを読んだり変更したりするだけの開発者は、ツールなしで通常通り作業できます。上流の変更をプルしたり、ローカルの変更を上流にプッシュしたりする同期操作を実行するチームメンバーのみがgit-subrepoをインストールする必要があります。

Git subrepoは、サブディレクトリ内の.gitrepoメタデータファイルに最後に同期されたコミットを追跡します。これはバージョン固定の一形態を提供しますが、親リポジトリのツリーに正確なコミットSHAを記録するサブモジュールほど明示的ではありません。新しい上流の変更をプルするタイミングを制御できるため、固定されたバージョンはgit subrepo pullを実行したときにのみ進みます。

上流の変更を追跡し、変更を上流にプッシュする必要があるフォークまたはパッチされたオープンソースライブラリをベンダリングする場合には機能します。ただし、変更されていないサードパーティの依存関係については、npmやyarnなどのパッケージマネージャーが一般的により適切です。これらは、git-subrepoが提供しないバージョン管理、ロックファイル、エコシステムツールを提供するためです。

埋め込まれたコードは通常のファイルとして存在するため、リポジトリ内でそのまま残ります。ただし、将来の更新をプルしたり、変更を上流にプッシュしたりする能力は失われます。リポジトリが移動した場合は.gitrepoメタデータファイルを更新して新しいリモートを指すようにするか、単にベンダリングされたコードを静的スナップショットとして使い続ける必要があります。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay