【 git clone 】コマンド――Gitのリポジトリを複製する:Linux基本コマンドTips(381)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGit用のgitコマンドで、リポジトリを複製する「git clone」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。Gitのリポジトリを複製する「git clone」コマンドです。
git/git cloneコマンドとは?
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアのソースコードやWebサイトのコード、ドキュメント管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。
gitのサブコマンドとGitの仕組み
gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します。今回紹介する「git clone」は既存の「リポジトリ」を複製します(本連載ではgitとサブコマンドの組み合わせをコマンドとして紹介します)。
リポジトリ(repository)とは、ソースコードや変更履歴、コメントなどを一括して保管する場所です。リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、「GitHub」などのWebサービス上に作る「リモートリポジトリ」があり、両者を連携させることで複数の開発者による開発を1本にまとめることができます。
既存のリポジトリ(リモートリポジトリ)にあるソースコードなどを入手したい場合は、まず、「git clone」でリポジトリを自分の環境に複製します(※1)。リモートリポジトリの内容がバージョンアップされたら「git pull」コマンドで最新版を取得します(連載第382回)。開発に参加するのではなく、単に最新版を取得したいという場合は、「git clone」と「git pull」を利用すればよいでしょう。
※1 特定のファイルだけが欲しい場合、例えばGitHub(github.com)にあるリポジトリであれば「Raw」というボタンで表示されるURLを使い、「wget」コマンドなどを使ってダウンロードできる。この他、プロジェクト全体をダウンロードするためのリンクも用意されている([Clone or download]ボタン→「Download ZIP」)。
保管場所であるリポジトリに対し、ファイルの編集などを行う場所を「ワークツリー」あるいは「ワーキングエリア」などと呼びます。「git clone」や「git pull」で取得した最新版のファイルはワークツリーに配置されます。つまり「作業ディレクトリ」です。
ワークツリー(作業ディレクトリ)で編集した結果をリポジトリに反映する操作を「コミット」と呼びます。「git add」コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。
インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。
Gitには、この他、開発中のプログラムやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。
コマンドの書式
git [オプション] サブコマンド [サブコマンドごとのオプションや引数]
git clone [オプション] リポジトリ [複製先]
※ [ ]は省略可能な引数を示しています。
gitの主なオプション
短いオプション | 長いオプション | 意味 |
---|---|---|
-C パス | カレントディレクトリではなく指定したディレクトリで実行したものとする | |
--bare | リポジトリを「bareリポジトリ」(ワーキングディレクトリが存在しない、管理だけを目的としたリポジトリ)として扱う | |
-c 設定=値 | 設定値を指定する(設定は「git config」で確認可能) | |
-p | --paginate | 全ての出力を「less」コマンドまたは環境変数PAGERで指定されたコマンドで表示する |
-P | --no-pager | lessコマンドで表示しない(「-p」の指定を打ち消す) |
--exec-path=パス | gitの実行ファイルのパスを指定する(「--exec-path」のみの場合、実行ファイルのパスを表示する) | |
--html-path | gitのHTML形式のドキュメントがインストールされたパスを表示する | |
--man-path | gitのmanファイルのパスを表示する | |
--info-path | gitのinfoファイルのパスを表示する |
gitのサブコマンド
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットと作業ツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | 作業ツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
git cloneの主なオプション
短いオプション | 長いオプション | 意味 |
---|---|---|
--separate-git-dir ディレクトリ名 | リポジトリ(「.git」ディレクトリ)を複製する場所を指定する。ワークディレクトリと別の場所にリポジトリ作成できる(本文を参照) | |
-b | --branch ブランチ | チェックアウトしたいブランチを指定する |
--single-branch | HEADまたは--branchで指定したブランチ1つだけを複製する | |
--depth 個数 | 全ての履歴ではなく、指定した個数分の履歴だけを取得する。.git/shallowファイルを生成し、「shallow clone」となる(後ほど「git fetch」を行う際に深さを変更することが可能) | |
--no-tags | タグを複製しない | |
-o | --origin 名称 | 「origin」の代わりに使用する名称を指定する |
-n | --no-checkout | チェックポイントを作成しない |
--bare | 「bareリポジトリ」(ワーキングディレクトリが存在しない、管理だけを目的としたリポジトリ)を作成する | |
--mirror | ミラーリポジトリを作成する(bareリポジトリとなる) | |
--no-hardlinks | ハードリンクを使用せず、常にコピーを使用する | |
-s | --shared | 共有リポジトリとして作成する(--shared=パーミッションで、作成するリポジトリのパーミッションを指定することも可能) |
--template ディレクトリ | テンプレートディレクトリを指定する | |
--reference リポジトリ | 参照用のローカルリポジトリを指定する | |
--reference-if-able リポジトリ | 参照用のローカルリポジトリを指定する、存在しないディレクトリはスキップする | |
-c 設定=値 | --config 設定=値 | 新しいリポジトリ用の設定値を指定する |
-4 | --ipv4 | IPv4だけを使用する |
-6 | --ipv6 | IPv6だけを使用する |
-v | --verbose | 詳しいメッセージを表示する |
-q | --quiet | メッセージをなるべく表示しない |
--progress | 進行状態を表示する |
リポジトリを複製する
「git clone リポジトリのURL」で、カレントディレクトリにプロジェクトの名称(多くの場合はURLの末尾)を付けたディレクトリを作成します(画面1)。同じ名前のディレクトリが既にある場合、「git clone」コマンドでは複製できません。この場合は、既存のディレクトリを別の名前に変更するか、「git clone リポジトリのURL ディレクトリ名」で、クローンを作成する場所を指定します(※2)。
※2 どうしても既存のディレクトリに作成する必要がある場合は、「git init」コマンドで初期化して、「git remote」コマンドでリモートリポジトリとの関連付けを設定すればよい。
作成したディレクトリの中には最新版のファイルやドキュメントがコピーされています。さらに、「.git」というリポジトリ用のディレクトリが作成されて、その中にバージョン管理の履歴を保管します。
コマンド実行例
git clone リポジトリのURL
(カレントディレクトリにリポジトリを複製する)
git clone リポジトリのURL ディレクトリ
(リポジトリを指定したディレクトリに複製する)
git clone https://github.com/progit/progit2-ja
(リポジトリを複製して、カレントディレクトリに「progit2-ja」というディレクトリを生成する、※3)
git clone https://github.com/progit/progit2-ja gitbook_ja
(リポジトリをカレントディレクトリ下の「gitbook_ja」に複製する)
※3 リモートリポジトリのURLはhttpから始まるとは限らない。例えば、GitHubというWebサービスの場合、「git clone git@github.com:progit//progit2-ja」のように指定することも可能。ただし、ssh接続を使うため、あらかじめGitHubにアカウントを作成後、公開キーを設定しておく必要がある。
非公開のリポジトリの場合、ユーザー名とパスワードを入力する必要があります(画面2)。
ローカルにあるリポジトリを複製することも可能です。この場合は、作業ディレクトリ(.gitの親ディレクトリ)または、リポジトリのパスを指定します(画面3)。
「.git」ディレクトリを別の場所に指定して複製する
通常、ローカルリポジトリは「git clone」で生成されたディレクトリの中に「.git」という名前で作成されます。別の場所にしたい場合は「--separate-git-dir」でパスを指定します(画面4)。なお、既存のディレクトリは指定できません。
作業ディレクトリには「.git」というファイルが作成されます。「.git」ファイルにはローカルリポジトリのパスが保存されています。
コマンド実行例
git clone --separate-git-dir ディレクトリ リポジトリのURL
(リポジトリを複製する。ローカルリポジトリは指定したディレクトリになる)
git clone --separate-git-dir git_dir/myproj https://github.com/myname/myproj
(リポジトリを複製する。ローカルリポジトリはgit_dir(既存ディレクトリ)下のmyproj(新規ディレクトリ)になる)
筆者紹介
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.