Git shallow clone: その概念、使用時期、そして使用方法

リポジトリをgit clone
でクローンする場合、通常はコミット履歴全体が取得されます。しかし、履歴全体が必要ない場合はどうでしょうか?そこで浅いクローン(shallow clone)の出番です。この記事では、浅いクローンとは何か、その仕組み、そして使用するタイミングについて、コピー&ペーストですぐに使える例とともに説明します。
重要ポイント
- 浅いクローンは
git clone
実行時に取得する履歴の量を制限します - CI、大規模リポジトリ、迅速なセットアップに最適です
--depth
、--single-branch
、--shallow-since
の使い方を学びましょう
Gitにおける浅いクローンとは?
浅いクローンは、リポジトリの履歴全体ではなく一部だけを取得するGitクローンです。これによりダウンロードサイズと時間が大幅に削減されます。特に以下の場合に役立ちます:
- 完全なコミット履歴が必要ない場合
- CI/CDパイプラインの高速セットアップが必要な場合
- 大規模なリポジトリを扱う場合
浅いクローンと通常のクローンの比較
機能 通常のクローン 浅いクローン 履歴全体を取得 はい いいえ(限定的なコミット) クローン速度 遅い 速い Git操作(rebase、bisect) 完全サポート 一部制限あり CI/CDに最適 最適ではない はい
浅いクローンの実行方法
最新のコミットのみをクローン
git clone --depth=1 https://github.com/owner/repo.git
特定のブランチを限定的な履歴でクローン
git clone --depth=1 --branch main --single-branch https://github.com/owner/repo.git
特定の日付以降のコミットをクローン
git clone --shallow-since="2024-01-01" https://github.com/owner/repo.git
大きなファイルのダウンロードを完全にスキップしたい場合は、部分クローンと--filter=blob:none
も使用できます。
浅いクローンを完全なクローンに変換できますか?
はい、後で完全な履歴が必要になった場合:
git fetch --unshallow
これにより不足しているコミットが取得され、浅いクローンが完全なクローンに変換されます。
浅いクローンはいつ使うべきか?
浅いクローンが適している場合:
- コードの最新バージョンのみが必要な場合
- CIパイプラインを実行し、ビルドを高速化したい場合
- 完全な履歴が不要なコードの検査やテストを行う場合
浅いクローンを避けるべき場合:
git bisect
、git rebase
、マージ操作を実行する必要がある場合- 変更に貢献し、コミット履歴へのアクセスが必要な場合
- リポジトリの完全なコンテキストに依存するツールを開発している場合
浅いクローンの一般的な問題
Git操作が失敗する可能性
一部のコマンドは完全な履歴を前提としており、浅いクローンではエラーが発生します:
git merge-base
git rebase
git bisect
解決策:git fetch --unshallow
を実行するか、そのようなコンテキストでは浅いクローンを避けてください。
浅いクローンはモノレポツールを破壊する可能性がある
LernaやNxなどのツールは、依存関係グラフや影響を受けるパッケージのためにリポジトリのコミット履歴への完全なアクセスを前提としている場合があります。特定のツールチェーンでテストしてください。
結論
浅いクローンは、特にCIや大規模リポジトリを扱う場合に開発ワークフローを高速化する優れた方法です。トレードオフを理解しておきましょう — 必要に応じて後から完全なクローンに変換することも可能です。
よくある質問
はい。取得するコミットが少ないため、特に大規模リポジトリではダウンロードと処理が速くなります。
はい、できますが、クローンを完全な状態に戻さない限り、履歴関連の操作の一部が失敗する可能性があります。
`git fetch --unshallow`を実行して、リポジトリを完全なクローンに変換します。
はい — 実際、GitHub Actionsはデフォルトで浅いクローン(`fetch-depth: 1`)を使用しています。