Git チュートリアル - git clone

ここでは、git clone コマンドについて詳しく説明します。git clone は、既存のリポジトリをターゲットとして使用する Git コマンドラインユーティリティで、ターゲットリポジトリのクローンまたはコピーを作成します。このページでは、git clone コマンドの拡張構成オプションと使用例について説明します。ここで取り上げる主なポイントは、以下のとおりです。

  • ローカルまたはリモートリポジトリのクローン作成
  • ベアリポジトリのクローン作成
  • shallow オプションを使った、リポジトリの部分的なクローン作成
  • Git URL 構文とサポート対象のプロトコル

リポジトリのセットアップガイドでは、git clone の基本的な使用例を取り上げました。このページでは、さらに複雑なクローン作成や構成のシナリオを学びます。

目的: リポジトリ間コラボレーションにおける開発コピー

プロジェクトの中央リポジトリが既に作成されている場合、ユーザーがローカルの開発コピーを取得する最も一般的な方法は git clone コマンドを使用することです。git init 同様、クローン作成も通常は 1 回限りの操作です。開発者がいったん作業コピーを取得すると、すべてのバージョンの管理操作とコラボレーションがそのローカルリポジトリを経由して管理されます。

リポジトリ間コラボレーション

Git における「作業コピー」は、SVN リポジトリからコードをチェック アウトして得られる作業コピーとは大きく異なる概念であることを理解してください。SVN とは異なり、Git では作業コピーと中央リポジトリとの間に実質的な相違はなく、両者とも完全な Git リポジトリです。

Git を使ったコラボレーションと SVN を使ったコラボレーションは、この点で根本的に異なります。SVN は中央リポジトリと作業コピーの間の関係に依存しますが、Git のコラボレーションモデルはリポジトリ間の相互作用に基づきます。SVN の中央リポジトリに作業コピーをチェックインする代わりに、あるリポジトリから別のリポジトリへ、コミットをプッシュまたはプルします。

Git チュートリアル: リポジトリと作業ディレクトリのコラボレーション Git チュートリアル: リポジトリ間コラボレーション

もちろん、特定の Git リポジトリに特別な意味を与えることも可能です。たとえば、単に Git リポジトリを「中央」リポジトリとして指定すれば、Git を使用して一元化されたワークフローを複製できます。ポイントは、VCS 自体の機能を使っているのではなく、規則を通して実行しているという点です。

使用法

当初 git clone は、別の場所の新しいディレクトリにクローンやコピーを作成する目的で既存のリポジトリを指定するために使われていました。元となるリポジトリには、ローカルのファイルシステム、またはサポートされるプロトコルでアクセス可能なリモートマシンに存在するものを使用できます。git clone コマンドは、既存の Git リポジトリをコピーします。これは SVN のチェックアウトに似ていますが、「作業コピー」自体が完全な Git リポジトリである点が異なっています。独自の履歴を持ち、ファイルを自己管理する、元のリポジトリから完全に独立した環境です。

ユーザーの便宜のため、クローン作成を行うと、元のリポジトリを指す「origin」という名称のリモート接続が自動的に作成されます。これにより、中央リポジトリとの通信がきわめて簡単になります。この自動接続は、refs/remotes/origin にあるリモートブランチの HEAD への Git 参照を作成し、構成変数の remote.origin.urlremote.origin.fetch を初期化することで確立されます。

git clone の使用例は、リポジトリセットアップガイドに記載されています。以下の例は、SSH ユーザー名 john を使用して、サーバー example.com に格納された中央リポジトリのローカルコピーを取得する方法を示しています。

git clone ssh://john@example.com/path/to/my-project.git 
cd my-project 
# Start working on the project

最初のコマンドでは、ローカルマシーンの my-project フォルダーにある新規 Git リポジトリを初期化し、中央リポジトリのコンテンツを取り込みます。次に、プロジェクト内へ移動して、ファイルの編集、スナップショットのコミット、他のリポジトリとの通信などを開始できるようにします。なお、クローン作成されるリポジトリに .git という拡張子が付いていないことに留意してください。これは、ローカルコピーの状態がノンベアであることを意味します。

特定のフォルダーにクローンを作成する

git clone <repo> <directory>

<repo> にあるリポジトリのクローンを、ローカル マシン上の ~<directory>! という名前のフォルダーに作成します。

特定のタグのクローンを作成する

git clone --branch <tag> <repo>

<repo> にあるリポジトリの、<tag> を参照するクローンのみを作成します。

shallow clone

git clone -depth=1 <repo>

<repo> にあるリポジトリの、オプション depth=1 で指定した
コミット履歴のクローンのみを作成します。この例では、<repo> のクローンが作成されます。新たにクローン作成されるリポジトリには、前回実行されたコミットのみが含まれます。shallow clone は、大量のコミット履歴があるリポジトリを使っている場合に最適です。大量のコミット履歴は、クローン作成に際し、ディスク領域の容量制限や長い待ち時間など、拡張に関する問題を引き起こす可能性があります。shallow clone は、こうした拡張に関する問題を軽減できます。

構成オプション

git clone -branch

-branch 引数を使用すると、リモートの HEAD が指すブランチ (通常は main ブランチ) の代わりに、クローンを作成する特定のブランチを指定できます。また、ブランチの代わりにタグを渡しても同じ操作が可能です。

git clone --branch

上の例では、リモートの Git リポジトリから new_feature ブランチのみがクローン作成されます。これは、純粋にリポジトリの HEAD 参照をダウンロードする時間を節約するための便利なユーティリティです。後で必要な参照をさらにフェッチする必要があります。

git clone -mirror 対 git clone -bare

git clone --bare

git init --bare と同様に、-bare 引数を git clone に渡すと、省略された作業ディレクトリにリモートリポジトリのコピーが作成されます。つまり、プロジェクトの履歴を持つリポジトリが作成されます。このリポジトリでは、プッシュやプルは可能ですが、直接編集することはできません。また、このリポジトリのリモートブランチは、-bare リポジトリでは構成されません。git init --bare のように、開発者が直接編集できない、ホストされたリポジトリを作成するために使用します。

git clone --mirror

--mirror 引数を渡すと、--bare 引数も暗黙的に渡されます。つまり、--mirror を指定すると、--bare 動作も継承されます。その結果、編集可能な作業ファイルを持たないベアリポジトリが作成されます。また、--mirror は、リモートリポジトリの拡張参照をすべてクローン作成し、リモートブランチの構成追跡を維持します。その後ミラーで git remote update を実行すると、元のリポジトリの参照がすべて上書きされます。完全に「ミラー」化された機能を提供します。

その他の構成オプション

その他すべての git clone オプションについては、Git 公式ドキュメントをご覧ください。このドキュメントでは、その他の一般的なオプションをいくつかご紹介します。

git clone --template

git clone --template=<template_directory> <repo location>

<repo location> にあるリポジトリをクローンして、新規作成されたローカル ブランチに <template directory> のテンプレートを適用します。Git テンプレートの完全な参照については、git init ページをご参照ください。

Git URL

Git では独自の URL 構文を使用して、リモート リポジトリの場所を Git コマンドに渡します。リモート リポジトリで git clone が最もよく使われているため、ここでは Git URL 構文について説明します。

Git URL プロトコル

- SSH

Secure Shell (SSH) は、ほとんどのサーバーで一般的に既定で構成されている、ユビキタス認証ネットワーク プロトコルです。SSH は認証プロトコルであるため、接続前にホスト サーバーから認証情報の証明を受ける必要があります。ssh://[user@]host.xz[:port]/path/to/repo.git/

- GIT

Git 独自のプロトコルです。Git は、ポート (9418) で実行するデーモンを使用します。このプロトコルは SSH に似ていますが、認証はありません。git://host.xz[:port]/path/to/repo.git/

- HTTP

ハイパー テキスト トランスファー プロトコルです。この Web 用のプロトコルは、インターネットを介した Web ページの HTML データの転送に最もよく使われます。Git では、HTTP http[s]://host.xz[:port]/path/to/repo.git/ を介して通信するよう構成できます。

概要

このドキュメントでは、git clone について詳しく見てきました。最も重要なポイントは、以下のとおりです。

1. git clone は、ターゲットリポジトリのコピーを作成するために使用する。

2. ターゲットリポジトリは、ローカルでもリモートでもかまわない。

3. Git は、リモートリポジトリにアクセスするためのネットワークプロトコルを複数サポートしている。

4. クローンのコンテンツを変更できる、多数の異なる構成オプションが用意されています。

git clone 機能のさらに詳しいリファレンスについては、Git 公式ドキュメントをご覧ください。また、リポジトリのセットアップガイドでは、git clone の実例も取り上げています。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める