【ITニュース解説】git clone Like a Pro: From -b develop to Partial & Sparse Clones (Basic Expert)
2025年09月10日に「Dev.to」が公開したITニュース「git clone Like a Pro: From -b develop to Partial & Sparse Clones (Basic Expert)」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
git cloneは単にリポジトリをコピーするだけでなく、特定のブランチや履歴深度、ファイル内容、ディレクトリ構成など、目的に応じて細かく制御できる。記事では基本から応用まで、効率的な作業環境構築のための様々なオプションを解説する。
ITニュース解説
git cloneは、Gitを使ってバージョン管理されているプロジェクトのコードを、インターネット上やサーバーにあるリモートリポジトリから、自分のコンピューターにコピー(複製)するための最も基本的なコマンドの一つである。ただ単にプロジェクトをコピーするだけでなく、さまざまなオプションを組み合わせることで、必要な部分だけを効率的に取得したり、特定の目的のためにリポジトリをカスタマイズしたりできる。
まず、git cloneの最も基本的な使い方は、リモートリポジトリのURLを指定して実行することだ。このコマンドを使うと、リモートリポジトリのすべてのブランチを追跡できるように設定され、通常はメインブランチ(多くの場合mainやmasterと呼ばれる)が自動的にローカルの作業ディレクトリにチェックアウトされる。これにより、すぐにプロジェクトのコードを編集したり、実行したりできるようになる。
しかし、プロジェクトによっては、特定の開発中のブランチだけが必要な場合がある。そのような時は、-bオプションを使ってクローン時に直接目的のブランチ名を指定できる。例えば、git clone -b develop <URL>とすると、developブランチがチェックアウトされた状態でリポジトリが複製される。さらに、--single-branchオプションを組み合わせると、指定したブランチの履歴のみをダウンロードするように制限できる。これは、特にブランチが非常に多い大規模なプロジェクトで、無駄なデータを取得せずに済ませたい場合に非常に有効だ。
また、プロジェクトの全履歴が必要なく、最新のコードだけを見たい場合は、--depth Nオプションが便利である。このオプションは、最新のN個のコミットだけをダウンロードするように指示する。例えば、--depth 1と指定すれば、最新のコミットだけを取得し、それ以前の履歴はダウンロードしない。これは「浅いクローン」と呼ばれ、クローンにかかる時間とディスク容量を大幅に削減できるため、特にCI/CD(継続的インテグレーション・継続的デリバリー)環境などでのビルド時間を短縮するのに役立つ。浅いクローンは、通常--single-branchオプションと組み合わせて使うと、さらに効率的になる。
次に、クローン時の設定についてだが、リモートリポジトリへのアクセス方法として主にHTTPSとSSHの二種類がある。HTTPSは設定が簡単で多くの環境で利用しやすいが、パスワード認証が必要になる場合がある。一方、SSHは公開鍵認証を使うため、一度設定すればパスワード入力を省略でき、頻繁にコミットをプッシュする開発者にとって非常に便利である。どちらを使用するかは、プロジェクトや個人の設定による。
クローンしたリポジトリの「リモート名」をデフォルトのoriginから変更したい場合は、-oオプションを使うことができる。例えば、git clone -o upstream <URL>とすれば、リモート名がupstreamとなる。また、git clone時に-c key=valueオプションを使って、新しいリポジトリ固有のGit設定を最初から適用することも可能だ。例えば、改行コードの自動変換設定などを指定できる。
さらに、リポジリに多くのタグが含まれている場合、タグの情報をダウンロードしないようにするには--no-tagsオプションが有効である。これはクローン時のデータ量を少し減らすことにつながる。タグが必要になった場合は、後からgit fetch --tagsコマンドで取得できる。GitHub CLI(ghコマンド)を使っている場合は、gh repo cloneコマンドの後に--を挟んでgit cloneのオプションを渡すことで、CLIツール経由で詳細なオプションを指定できる。
大規模なプロジェクト、特にモノレポ(複数のプロジェクトやサービスが単一のリポジトリで管理されている形態)を扱う際には、さらに高度なクローン方法が役立つ。その一つが「部分クローン」だ。--filter=blob:noneオプションを使うと、ファイルの内容(Gitでは「ブロブ」と呼ぶ)を初回クローン時にダウンロードせず、必要なファイルがチェックアウトされたり参照されたりしたときに初めてオンデマンドで取得するようになる。これにより、巨大なコードベースを持つリポジトリでも、最初のクローンを非常に高速に行える。
部分クローンと合わせて使うと強力なのが「スパースチェックアウト」である。これは、リポジトリ全体をクローンするものの、ローカルの作業ディレクトリには指定した特定のディレクトリやファイルだけを展開する機能だ。モノレポで自分の担当するサブプロジェクトのコードだけを扱いたい場合や、CI環境で特定のサービスだけをビルドしたい場合に、無関係なファイルのダウンロードやインデックス作成を省略し、ディスク容量と処理時間を節約できる。利用するには、まず部分クローンを行い、cdでリポジトリに入った後、git sparse-checkout init --coneとgit sparse-checkout set <ディレクトリ名>で設定する。
プロジェクトによっては、別のGitリポジトリをサブディレクトリとして取り込む「サブモジュール」を使っている場合がある。git clone時に--recurse-submodulesオプションを使うと、親リポジトリと同時にサブモジュールも自動的に初期化され、更新される。さらに、--shallow-submodulesオプションを組み合わせれば、サブモジュールも浅いクローンとして取得できるため、全体的なクローン時間を短縮できる。
また、Git LFS(Large File Storage)を使って、画像や動画などの大きなバイナリファイルを管理しているリポジトリの場合、これらの大きなファイルをクローン時にダウンロードしないようにすることもできる。GIT_LFS_SKIP_SMUDGE=1という環境変数を設定してgit cloneを実行するか、git lfs install --skip-smudgeをグローバル設定しておけば、LFSファイルをスキップしてクローンできる。これらのファイルは、必要な時にgit lfs pullで手動でダウンロードする。
さらに専門的な用途としては、「ミラークローン」や「ベアクローン」がある。--mirrorオプションを使うと、リモートリポジトリのすべて(ブランチ、タグ、履歴、参照など)を完全に複製し、ローカルにその完璧なコピー(ミラー)を作成できる。これは主にバックアップ目的や、CI/CD環境でリモートリポジトリの完全なコピーを維持したい場合に使う。一方、--bareオプションは、作業ディレクトリを持たず、Gitのオブジェクトデータベースのみを含む「ベアリポジトリ」を作成する。これは、チームで共有する中央リポジトリとして使う場合に一般的だ。
また、--separate-git-dirオプションを使うと、.gitディレクトリ(Gitの履歴管理情報が格納されている場所)を作業ディレクトリとは別の場所に配置できる。これは、複数の作業ツリーを同じリポジトリに対して使いたい場合や、ビルドエージェントのように作業ディレクトリを頻繁にクリーンアップする環境で、.gitディレクトリを永続化したい場合に便利である。
これらの様々なオプションを組み合わせることで、目的に応じて非常に柔軟かつ効率的なクローンが可能となる。例えば、--filter=blob:none --single-branch -b <ブランチ名> --depth 20 --no-tagsといった形で複数のオプションを組み合わせ、さらにスパースチェックアウトを適用すれば、指定したブランチの最新の履歴の一部だけを、ファイル内容をオンデマンドで取得し、特定のディレクトリのみをローカルに展開するという、非常に小さく高速な作業コピーを手に入れることができる。
git cloneには多くのオプションがあるが、そのメンタルモデルを理解すると選びやすくなる。Gitはまずリモートからブランチやタグ(リファレンス)を発見し、次に--single-branchや--depthでどの履歴を取得するかを決定する。その次に、--filterでファイルのデータ(オブジェクト)をどう取得するかを決め、最後にスパースチェックアウトによってディスク上にどのファイルを展開するかを決定する。サブモジュールやLFS、ミラーなどの特殊な要素は、これらのプロセスに追加される形だ。自分のユースケースに合わせて、各段階で必要な調整だけを行えばよい。
結局のところ、日常的な開発で特定のブランチを扱う場合は、-b <ブランチ名> --single-branch --depth 1が、高速で効率的なクローン方法としておすすめできる。非常に大規模なリポジトリでは、--filter=blob:noneとスパースチェックアウトを組み合わせることで、作業環境を劇的に改善できるだろう。バックアップやCI用には--mirrorが最も確実な選択肢となる。これらのオプションを適切に使いこなすことで、不必要なデータのダウンロードを減らし、開発作業をよりスムーズに進めることができるだろう。