Gitのシャロークローン:使用するタイミングと方法

CIや一時的な作業で高速なGitチェックアウトを行うためにシャロークローンを使用し、より多くの履歴が必要な場合に深くしたり浅くしたりする方法を学びます。

Gitのシャロークローン:使用するタイミングと方法

Gitのシャロークローンは、コミット履歴の一部のみを取得します。CIジョブ、デプロイ手順、または簡単な確認作業で現在のコードが必要だが、何年もの履歴は不要な場合に便利です。

すべての開発者ワークステーションに最適なデフォルトではありません。シャロークローンは時間とディスク容量を節約できますが、より多くのコミットを取得するまで履歴ベースのコマンドを制限します。

シャロークローンとは?

標準のクローンは、通常のブランチ作業、履歴調査、古いタグのチェックアウト、オフライン調査に十分な履歴を取得します。シャロークローンは、選択した深さでその履歴を切り詰めます。

たとえば、--depth 1は選択したブランチの先端コミットを取得します。--depth 50はより最近の履歴を取得しますが、完全な祖先は取得しません。

シャロークローンの利点

主な利点は転送コストの削減です:

  • 大規模リポジトリの初回チェックアウトが高速。
  • 短期間のビルドエージェントでのディスク使用量が少ない。
  • 低速または従量制ネットワークでの帯域幅使用量が少ない。
  • 初期クローン時にGitが処理する履歴が少ない。

現在のコミットをビルドしてワークスペースを破棄するCIパイプラインでは、シャロークローンはしばしば明確な利点があります。

シャロークローンの欠点と制限

トレードオフは履歴の欠落です:

  • git logはシャロー境界で停止します。
  • git blameは古い変更を追跡できない場合があります。
  • 古いタグやコミットは、取得されるまで利用できません。
  • Gitが必要なマージベースを見つけられない場合、リベースやマージが困難になることがあります。
  • 一部のリリースや監査ワークフローは完全な履歴を期待します。

作業に古いリグレッションのデバッグ、リリースの準備、または変更のバックポートが頻繁に含まれる場合は、完全なクローンから始めてください。

シャロークローンの作成方法

git clone --depthを使用します:

git clone --depth <数値> <リポジトリURL>

たとえば、リポジトリをクローンして最新の10コミットのみを取得する場合:

git clone --depth 10 https://github.com/example/large-repo.git

ブランチの先端のみが必要なビルドジョブの場合:

git clone --depth 1 https://github.com/example/project.git

特定のブランチをクローンする場合:

git clone --depth 1 -b develop https://github.com/example/project.git

そのブランチの履歴のみが必要な場合は、--single-branchを追加することもできます:

git clone --depth 1 --single-branch --branch develop https://github.com/example/project.git

シャロークローンの管理

より多くの履歴を取得する(クローンの深化)

クローン後により多くの履歴が必要な場合は、リポジトリを深くします:

git fetch --deepen=50 origin

これにより、現在のシャロー境界を超えてさらに50コミットが取得されます。

希望する総深度を設定することもできます:

git fetch --depth=100 origin

重要な点:git remote set-depthは有効なGitコマンドではありません。深度はクローンおよびフェッチオプションを通じて制御されます。

タグの取得

シャロークローンには、特に古いコミットを指すタグなど、すべてのタグが含まれていない場合があります。ワークフローで必要な場合にのみタグを取得します:

git fetch --tags origin

リポジトリの浅さを解除する

シャロークローンを完全なクローンに変換するには、残りの履歴を取得します:

git fetch --unshallow origin

このコマンドは、リモートリポジトリから残りの履歴をダウンロードします。

シャロークローンからのプッシュ

新しいコミットがフェッチしたリモートブランチの先端に基づいている場合、シャロークローンからのプッシュは機能します。ただし、履歴の欠落によりリベース、競合解決、レビューが困難になるため、長期開発には適していません。

履歴関連のプッシュやマージの問題が発生した場合は、続行する前にさらに履歴を取得するか、クローンの浅さを解除してください。

シャロークローンを使用するタイミング

ジョブが短期間で履歴が重要でない場合に使用します:

  • CI/CDチェックアウト。
  • 読み取り専用の調査。
  • 一時的な再現環境。
  • ドキュメントビルド。
  • 低速ネットワーク上の大規模リポジトリ。

シャロークローンを使用すべきでないタイミング

以下の作業を定期的に行う場合は避けてください:

  • 深いgit loggit blame、またはgit bisect
  • 古いタグを使用するリリース作業。
  • 複雑なマージやリベース作業。
  • 履歴をまたがるオフラインデバッグ。
  • 完全なクローンを期待するコントリビューションワークフロー。

実用的なポイント

最新のコードのみが必要な使い捨てジョブにはgit clone --depth 1を使用します。明確な理由がない限り、通常の開発には完全なクローンを使用します。

シャロークローンが邪魔になり始めたら、git fetch --deepen=<数値> originで深くするか、git fetch --unshallow originで変換します。これは、欠落した履歴エラーと一コマンドずつ戦うよりも通常は高速で安全です。