git clone 使い方

リポジトリを複製する(ダウンロードする)

git clone <repository>

とする。<repository> の指定は次のようにする。

git clone rsync://example.com/path/to/repo.git/
git clone http://example.com/path/to/repo.git/
git clone https://example.com/path/to/repo.git/
git clone git://example.com/path/to/repo.git/
git clone ssh://[user@]example.com[:port]/path/to/repo.git/

このとき、カレントディレクトリに repo ディレクトリが作られる。

ディレクトリを変更するには、リポジトリの指定の次にパスを指定する。

git clone <repository> path/to/dir

リモートリポジトリ origin の名前を変更する

「-o」オプションで origin に変わる名前を指定する。

git clone -o new_origin_name <repository>

とする。

ベアリポジトリやミラーとしてリポジトリを複製する

ワークツリーがないベアリポジトリとしてリポジトリをクローンする場合は

git clone --bare <repository>

とする。

また、リポジトリのミラーを作るには

git clone --mirror <repository>

とする。これは、「–bare」に加えて、全ての ref を作る (詳しくは man git-clone を参照)。

最新の履歴だけをコピーする(shallow repository)

ファイルを取得するためだけに使う場合、最新の履歴だけで済むことがある。 そういうときは

git clone --depth 1 <repository>

として shallow repository を作る。 ただ、制限があってこのコピーから clone、fetch、push することはできない。 また、このコピーに push することもできない。

リポジトリを複製するときにサブモジュールを取得する

「–recursive」オプションをつけて

git clone --recursive git://example.com/repo.git

とする。リポジトリをクローンした後に

git submodule update --init --recursive

を実行したことになる。

リポジトリを複製して特定のブランチをワークツリーに展開する

ブランチ BRANCH をもつリポジトリを複製するときに

git clone -b BRANCH https://example.com/repo.git

とすると、複製されたリポジトリのブランチが BRANCH になる。

ローカルにあるリポジトリを複製する

git clone /path/to/repo

とすると /path/to/repo にあるリポジトリがカレントディレクトリに複製される。 ローカルのパスが対象のとき、デフォルトでは -l または –local オプションの動作になり、 可能ならば、ディスクスペースの節約のために .git/objects ディレクトリ以下のファイルはハードリンクされる。

ls -i /path/to/repo/.git/objects/03
ls -i ./repo/.git/objects/03

のようするとハードリンクされていることを確認することができる。

通常の複製の動作にするには「–no-local」オプションをつける。

git clone --no-local /path/to/repo

また、ハードリンクだけを無効にするには「–no-hardlinks」オプションをつける。 この操作はバックアップを作成する用途に適している。

git clone --no-hardlinks /path/to/repo

注意: 「–no-local」と「–no-hardlinks」オプションの違いは、 git-clone のマニュアルだけではわからなかった。

ローカルのリポジトリの .git/objects をハードリンク以外で共有する

ローカルのリポジトリに対して

git clone -s /path/to/repo

とするとカレントディレクトリに repo が作られるのだが、 その中の .git/objects がソースとなったリポジトリと共有される。 具体的には .git/objects にファイルがなく、 .git/objects/info/alternates でソースのリポジトリが指定される。

(私自身も動作を把握しきれているとは言えないが) この操作はなにをやっているのか理解していないと危険。 ソースのリポジトリでブランチを削除したり、 (他のコマンドで自動で実行されることもある)git gc などで オブジェクトが削除されたり、参照がなくなったりすると コピーしたリポジトリが壊れるかもしれない。

ローカルにすでにダウンロードしたリポジトリを利用してリモートから取得するオブジェクトを減らす

あるリモートリポジトリを複数個複製する場合に refarence repository を利用することで ネットワークアクセスを減らすことができる。

git clone https://example.com/repo.git repo_first

とすると repo_first にリポジトリがダウンロードされる。 同じリポジトリを複製する場合に「–reference」オプションで repo_first を指定すると、まずrepo_first からオブジェクトを探し、 ない場合はリモートリポジトリから取得することになる。

git clone --reference /path/to/repo_first https://example.com/repo.git repo_second

repo_second の .git/objects/info/alternates を見ると repo_first へのパスが指定されている。

以降、repo_second で

git fetch
git pull

などを実行する場合も同じようにオブジェクトを探して取得するはずなので、 repo_first を更新してから repo_second を実行した方が効率が良い(と思う)。

git clone の「–shared」オプションで複製したリポジトリと同様に ソースとなったリポジトリでのオブジェクトの削除に注意する必要がある。 よくわからなければ、このオプションは使用してはいけない。

git のディレクトリを他のディレクトリに配置する

オプション「–separate-git-dir」に git のファイルを置くディレクトリを指定する。

git clone --separate-git-dir git_dir http://example.com/repo.git

ディレクトリ repo がワーキングディレクトリで ディレクトリ git_dir には git のファイルが保存されている。

参考

  • man git-clone

Tags of current page