git-clone

コマンド名

「git-clone」:リポジトリを新しいディレクトリに複製

概要

git clone [--template=<template_directory>]
          [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
          [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
          [--dissociate] [--separate-git-dir <git dir>]
          [--depth <depth>] [--[no-]single-branch] [--no-tags]
          [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
          [--[no-]remote-submodules] [--jobs <n>] [--sparse]
          [--filter=<filter>] [--] <repository>
          [<directory>]

説明

リポジトリを新しく作成したディレクトリに複製し、クローンリポジトリ内の各ブランチにリモート追跡ブランチを作成し(git branch --remotesを使用して表示)、クローンリポジトリの現在アクティブなブランチからフォークされた初期ブランチを作成、チェックアウトします。

クローン作成後、引数のないプレーンなgit fetchはすべてのリモート追跡ブランチを更新し、加えて引数のないgit pullはリモートマスターブランチを現在のマスターブランチにマージします(ただし、”–single-branch”の場合、これには当てはまりません。以下参照)。

このデフォルト設定はrefs/remotes/originの下にリモートブランチヘッドへの参照を作成し、remote.origin.urlおよびremote.origin.fetch設定変数を初期化することによって実行されます

オプション

-l
--local

クローンを作成するリポジトリがローカルマシン上にある場合、このフラグは通常の「Git aware」転送メカニズムをバイパスして、ヘッドやオブジェクトとrefsディレクトリの下にあるすべてをコピーすることによってリポジトリをクローンします。.git/objects/ディレクトリの下のファイルは可能な場合、スペースの節約のためにハードリンクされます。

リポジトリがローカルパス(例えば、/path/to/repo、等)として指定されている場合、それはデフォルトであり、-localは基本的には無処理となります。リポジトリがURLとして指定されている場合、このフラグは無視されます(ローカル最適化は使用されません)。--no-localを指定すると、/path/to/repoが指定されたときにデフォルトが上書きされ、その代わりに通常のGitトランスポートが使用されます。

--no-hardlinks

ハードリンクを使用する代わりに、ローカルファイルシステムのリポジトリからクローンプロセスを実行させ、.git/objectsディレクトリの下のファイルをコピーします。リポジトリのバックアップを作成しようとしている場合、好ましいでしょう。

-s
--shared

クローンを作成するリポジトリがローカルマシン上にある場合、ハードリンクを使用する代わり、オブジェクトをソースリポジトリと共有するため、.git/objects/info/alternates を自動的に設定します。 結果としてのリポジトリは当該オブジェクトなしで開始されます。

注記:以下は危険なオペレーションとなる可能性があります。それが何をするのかを理解しない限り、使用しないでください。当該オプションを使用してリポジトリをクローンし、そしてソースリポジトリ内のブランチを削除すると(または既存のコミットを参照しないようにする他のGitコマンドを使用すると)、一部のオブジェクトが参照されなくなる(もしくはダングリングされなくなる)可能性があります。これらのオブジェクトは自動的にgit gc --autoを呼び出す通常のGitオペレーション( git commitなど)によって削除できます( git-gc[1]を参照してください)。これらのオブジェクトが削除され、クローンリポジトリによって参照された場合、クローンリポジトリは破損します。

--shared でクローンリポジトリの--local オプションなしでgit repack を実行すると、オブジェクトがソースリポジトリからクローンリポジトリのパックにコピーされ、clone --sharedによるディスクスペースの節約がなくなります。ただし、デフォルトで--localオプションを使用する git gcを実行する場合は安全です。

--shared でクローンリポジトリのソースリポジトリへの依存を解消したい場合、git repack -a を実行するだけですべてのオブジェクトをソースリポジトリからクローンリポジトリのパックにコピーすることができます。

--reference[-if-able] <repository>

参照リポジトリがローカルマシン上にある場合、参照リポジトリからオブジェクトを取得するために.git/objects/info/alternates を自動的に設定します。既存のリポジトリを代替として使用する場合、クローンリポジトリからコピーする必要のあるオブジェクトが少なくなり、ネットワークとローカルのストレージコストが削減されます。--reference-if-ableを使用場合、クローンを中止する代わりに、存在しないディレクトリがスキップされ、警告が表示されます。

注記:--shared および --dissociate オプションの注記を参照してください。

--dissociate

ネットワーク転送を減らすための--reference オプションで指定された参照リポジトリからオブジェクトを借用し、借用したオブジェクトの必要なローカルコピーを作成してクローンした後、オブジェクトからの借用を停止します。このオプションは別のリポジトリからオブジェクトを既に借用しているリポジトリからローカルでクローンする場合にも使用できます。新しいリポジトリは同じリポジトリからオブジェクトを借用し、このオプションを使用して借用を停止できます。

-q
--quiet

静かに(メッセージを減らす)オペレーションします。進行状況は標準エラーストリームに報告されません。

-v
--verbose

長々と(メッセージを増やす)実行します。標準エラーストリームへの進行状況のレポートには影響を及ぼしません。

--progress

--quietが指定されていない限り、端末に接続されている場合、進捗状況はデフォルトで標準エラーストリームに報告されるようになっています。このフラグは標準エラーストリームが端末に送信されていない場合においても進行状況をレポートします。

--server-option=<option>

プロトコルバージョン2を使用して通信する場合、指定された文字列をサーバーに送信します。指定された文字列にはNULまたはLF文字を含めることはできません。不明なオプションを含むサーバーオプションの処理はサーバー固有です。複数の--server-option=<option> が指定されている場合、それらはすべてコマンドラインにリストされている順で送信されます。

-n
--no-checkout

クローン完了後、ヘッドのチェックアウトは実行されません。

--bare

ベアGitリポジトリを作成します。つまりdirectory> を作成して管理ファイルを<directory>/.gitに置く代わりに、<directory> 自体を$GIT_DIRにします。ワークツリーをチェックアウトする場所がないため、これは明らかに--no-checkout を意味します。またリモートのブランチヘッドは refs/remotes/origin/にマッピングされず、対応するローカルブランチヘッドに直接コピーされます。このオプションを使用すると、リモート追跡ブランチも関連する設定変数も作成されないことになります。

--sparse

スパースチェックアウトファイルを初期化し、ワークディレクトリがリポジトリのルートにあるファイルのみで開始されるようになります。スパースチェックアウトファイルは必要に応じてワークディレクトリを拡張するように変更することができます。

--filter=<filter-spec>

部分クローン機能を使用し、サーバーが特定のオブジェクトフィルターに従ってリーチ可能なオブジェクトのサブセットを送信するように要求します。--filterを使用する場合、提供された<filter-spec> が部分クローンフィルターに使用されます。例えば、--filter=blob:none はGitで必要になるまで、すべてのBLOB(ファイルの内容)を除外します。また--filter=blob:limit=<size> は少なくとも<size>のサイズのすべてのブロブを除外します。フィルタ仕様の詳細についてはgit-rev-list[1]の–filterオプションを参照してください。

--mirror

ソースリポジトリのミラーを設定します。これは--bareを意味します。--bareと比較し、--mirror はソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべての参照(リモート追跡ブランチ、ノートなどを含む)をマップし、これらすべての参照が次のように参照スペック設定をセットアップします。これらは ターゲットリポジトリ内のgit remote update によって上書きされます。

-o <name>
--origin <name>

リモート名のoriginを使用してアップストリームリポジトリを追跡する代わりに、<name>を使用します。

-b <name>
--branch <name>

新しく作成したヘッドをクローンリポジトリのヘッドが示すブランチに示す代わりに、<name> ブランチを示します。ベアでないリポジトリではこれはチェックアウトされるブランチのことです。--branch はタグを取得し、結果のリポジトリでそのコミット時にヘッドを切り離すこともできます。

-u <upload-pack>
--upload-pack <upload-pack>

指定され、クローン元のリポジトリがssh経由でアクセスされる時、もう一方で実行されるコマンドのデフォルトではないパスを指定します。

--template=<template_directory>

テンプレートが使用されるディレクトリを指定します(git-init[1]の「テンプレートディレクトリ」セクションを参照してください)。

-c <key>=<value>
--config <key>=<value>

新しく作成されたリポジトリに設定変数を設定します。これはリポジトリが初期化された直後、かつリモート履歴がフェッチされる前もしくはファイルがチェックアウトされる前に有効になります。キーはgit-config[1]のものと同じ形式です(例えば、core.eol=true)。同じキーに複数の値が指定されている場合、各値は設定ファイルに書き込まれます。これにより例えば、元のリモートにフェッチ参照スペックをを追加しても安全です。

現在の実行制限により、一部の設定変数は最初のフェッチとチェックアウトが完了するまで有効になりません。有効にならないことがわかっている設定変数は、remote.<name>.mirrorおよびremote.<name>.tagOptです。代わりに対応する --mirror および--no-tags オプションを使用してください。

--depth <depth>

指定されたコミット数に切り捨てられた履歴を持ったシャロークローンを作成します。すべてのブランチの末端近くの履歴をフェッチするために--single-branchが指定されていない限り、 --single-branchを意味するものとします。サイズの小さいサブモジュールをクローンする場合、--shallow-submodulesもパスします。

--shallow-since=<date>

指定した時間以降に履歴を持つシャロ―クローンを作成します。

--shallow-exclude=<revision>

指定されたリモートブランチまたはタグからリーチ可能なコミットを除き、履歴を持つシャロ―クローンを作成します。このオプションは複数回指定可能となっています。

--[no-]single-branch

--branchオプションで指定された、またはリモートのHEAD が指すプライマリーブランチのいずれかにおいて、シングルブランチの末端につながる履歴のみをクローンします。結果のリポジトリにさらにフェッチすると、このオプションが最初のクローンで使用されたブランチのリモート追跡ブランチのみが更新されます--single-branchがクローンされた時、リモートのヘッドがどのブランチも示していない場合、リモート追跡ブランチは作成されません。

--no-tags

タグをクローンせず、設定のremote.<remote>.tagOpt=--no-tagsをセットし、今後のgit pullおよびgit fetchオペレーションがタグに従わないようにします。それに続く明示的なタグフェッチは引き続き機能します(git-fetch[1]を参照)。

--single-branchと組み合わせて使用すると、シングルでクローンされたブランチ以外の参照なしでブランチをクローンおよび維持できます。これは便利であり、例えば、検索インデックス用の一部のリポジトリのデフォルトブランチの最小限のクローンを維持する場合などに便利です。

--recurse-submodules[=<pathspec>]

クローンが作成されたら、提供されたパススペックに基づいてサブモジュールを初期化し、クローンを作成します。パススペックが指定されていない場合、すべてのサブモジュールが初期化され、クローンされます。このオプションは複数のエントリで構成されるパススペックに対して複数回指定できます。作成されたクローンはパススペックが指定されていない場合、submodule.activeが指定されたパススペックまたは「.」に設定されています(すべてのサブモジュールを意味します)。

サブモジュールはデフォルト設定を使用して初期化およびクローンされます。これはクローンが終了した直後にgit submodule update --init --recursive <pathspec> を実行するのと同じです。クローンリポジトリにワークツリーもしくはチェックアウトがない場合(つまり、--no-checkout/-n--bare、もしくは--mirror のいずれかが指定されている場合)、このオプションは無視されます。

--[no-]shallow-submodules

クローンされたすべてのサブモジュールは深さ1のシャロ―となります。

--[no-]remote-submodules

クローンされるすべてのサブモジュールはスーパープロジェクトの記録されたSHA-1ではなく、サブモジュールのリモート追跡ブランチのステータスを使用してサブモジュールを更新します。--remotegit submodule updateにパスするのと同じです。

--separate-git-dir=<git dir>

クローンリポジトリを本来あるべき場所に置く代わりに、クローンリポジトリを指定されたディレクトリに置き、そこにファイルシステムに依存しないGitシンボリックリンクを作成します。その結果、Gitリポジトリをワークツリーから分離することができます。

-j <n>
--jobs <n>

同時にフェッチされたサブモジュールの数。デフォルトとしてはsubmodule.fetchJobs オプションです。

<repository>

クローンを作成する(場合によってはリモートの)リポジトリ。指定のリポジトリの詳細については以下の「GIT URLS」セクションを参照してください。

<directory>

クローンを作成する新しいディレクトリの名前。ディレクトリが明示的に指定されていない場合、ソースリポジトリの「humanish」の部分が使用されます(/path/to/repo.gitの場合はrepohost.xz:foo/.gitの場合はfoo )。既存のディレクトリへのクローンの作成はディレクトリが空の場合にのみ許可されます。

GITの URL

一般的にURLにはトランスポートプロトコル、リモートサーバーのアドレス、およびリポジトリへのパスに関する情報が含まれています。トランスポートプロトコルによってはこの情報の一部が欠落している場合があります。

Gitはssh、git、http、およびhttpsプロトコルをサポートしています(さらに、ftpおよびftpsをフェッチに使用できますが、これは非効率的であり推奨していません。使用しないでください)。

ネイティブトランスポート(つまりgit:// URL)は認証を行わないため、セキュリティで保護されていないネットワークでは注意して使用する必要があります。

次のシンタックスを使用できます。

  • ssh://[user@]host.xz[:port]/path/to/repo.git/
  • git://host.xz[:port]/path/to/repo.git/
  • http[s]://host.xz[:port]/path/to/repo.git/
  • ftp[s]://host.xz[:port]/path/to/repo.git/

代替scpのようなシンタックスもsshプロトコルで使用できます。

  • [user@]host.xz:path/to/repo.git/

このシンタックスは最初のコロンの前にスラッシュがない場合にのみ認識されます。これはコロンを含むローカルパスを区別するのに役立ちます。例えば、ローカルパスfoo:bar を絶対パスまたは./foo:barとして指定し、ssh urlとして誤って解釈されないようにすることができます。

sshおよびgitプロトコルはさらにユーザーネームの拡張をサポートします。

  • ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/
  • git://host.xz[:port]/~[user]/path/to/repo.git/
  • [user@]host.xz:/~[user]/path/to/repo.git/

Gitにサポートされているローカルリポジトリの場合、次のシンタックスを使用できます。

  • /path/to/repo.git/
  • file:///path/to/repo.git/

これらの2つのシンタックスは前者が–localオプションを意味していることを除き、ほとんど同じです。

git push 以外のgit clone、git fetch、git pullは適切なバンドルファイルも受け入れます。git-bundle[1].を参照してください。

Gitが特定のトランスポートプロトコルの処理方法を知らない場合、remote- <transport>のリモートヘルパー(存在する場合)を使用しようとします。リモートヘルパーを明示的に要求するには次のシンタックスを使用できます。

  • <transport>::<address>

ここでの<address>とはパス、サーバーとパス、または呼び出される特定のリモートヘルパーによって認識される任意のURLのような文字列です。詳細についてはgitremote-helpers[7] を参照してください。

同様の名前のリモートリポジトリが多数あり、それらに異なる形式を使用する場合(使用するURLが機能するURLに書き換えられるように)、次の形式の設定セクションを作成することができます。

[url "<actual url base>"]
        insteadOf = <other url base>

例えば、以下のように使用します。

[url "git://git.host.xz/"]
insteadOf = host.xz:/path/to/
insteadOf = work:

「work:repo.git」や「host.xz:/path/to/repo.git」のようなURLはURLが「git://git.host.xz/repo.git」になるコンテキストで書き換えられます。

プッシュ専用のURLを書き換えたい場合、次の形式の設定セクションを作成できます。

[url "<actual url base>"]
        pushInsteadOf = <other url base>

例えば、以下のように使用します。

[url "ssh://example.org/"]
        pushInsteadOf = git://example.org/

「git://example.org/path/to/repo.git」のようなURLはプッシュの場合、「ssh://example.org/path/to/repo.git」に書き換えられますが、プルの場合は引き続き 元のURLとなります。

アップストリームからのクローン

$ git clone git://git.kernel.org/pub/scm/…/linux.git my-linux
$ cd my-linux
$ make

チェックアウトせず、現在のディレクトリから借用するローカルクローンを作成します。

$ git clone -l -s -n . ../copy
$ cd ../copy
$ git show-branch

既存のローカルディレクトリから借用しながら、アップストリームからクローンを作成します。

$ git clone --reference /git/linux.git \
    git://git.kernel.org/pub/scm/…/linux.git \
    my-linux
$ cd my-linux

変更を公開するためのベアリポジトリを作成します。

$ git clone --bare -l /home/proj/.git /pub/scm/proj.git

GIT

git[1]パッケージソフトの一部

git公式ドキュメント

clone