Gitで一番最初に方に実行するコマンドの一つにgit clone(クローン)があります。
とりあえず最初はgit cloneするものだとおまじない的にやっている人もいるかもしれません。git cloneはただGithubのリモートレポジトリの内容をとってくる以外にも便利な使い方があります。
ここではgit cloneでできることについて実例を踏まえてまとめています。
git clone(クローン)とは何か?
git clone(クローン)はGithub上の指定したリモートレポジトリをローカルに丸ごとコピーするコマンドです。クローンという名前の通りのコマンドです。
git cloneの使い方
git cloneは使い方が大きく4つあります。
第1引数でリモートレポジトリのURLを指定し、必要に応じて第2引数でコピー先のディレクトリを指定します。
(4)はあまり知られていませんが自分のローカル環境にあるレポジトリを他のディレクトリに丸ごとコピーすることもできます。(単に使う場面がないだけですが、、)
現在のディレクトリにリモートレポジトリを丸ごと展開する場合
コマンドの内容
git cloneでは引数にリモートレポジトリのURLを指定します。
git clone <リモートレポジトリのURL>
実例
例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。
$ ls
local-pj/ vuecli/
ここに、リモートレポジトリ名 rails-testをクローンします。(URL: https://github.com/xxxxx/rails-test.git)
$ git clone https://github.com/xxxxx/rails-test.git
Cloning into 'rails-test'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0Receiving objects: 87% (469/539), 4.50 MiB | 8.98 MiB/s
Receiving objects: 100% (539/539), 7.27 MiB | 9.68 MiB/s, done.
Resolving deltas: 100% (235/235), done.
これでクローンが完了です。
ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。
$ ls
local-pj/ rails-test/ vuecli/
クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。
$ ls -a rails-test
./ .gitignore config/ entrypoint.sh* package.json storage/
../ .ruby-version config.ru Gemfile postcss.config.js test/
.browserslistrc app/ db/ Gemfile.lock public/ tmp/
.git/ babel.config.js docker-compose.yml lib/ Rakefile vendor/
.gitattributes bin/ Dockerfile log/ README.md yarn.lock
.gitなどの隠しディレクトリやファイルもきちんとコピーされています。
これで、該当のディレクトリでコミット履歴も参照することができます。
現在のディレクトリにディレクトリ名を指定して、リモートレポジトリを丸ごと展開する
コマンドの内容
git clone <リモートレポジトリのURL>
ではリモートレポジトリ名と同じ名前のディレクトリが自動生成されます。
ディレクトリ名を変えたいな~という場合もあるでしょう。その場合は第2引数でディレクトリ名を指定します。
git clone <リモートレポジトリのURL> <ディレクトリ名>
実例
例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。
$ ls
local-pj/ vuecli/
ここに、リモートレポジトリ名 rails-testの中身一式を「clone-test」というディレクトリ名の中にクローンします。(URL: https://github.com/xxxxx/rails-test.git)
第2引数を「clone-test」としてgit cloneを実行します。
$ git clone https://github.com/xxxxx/rails-test.git clone-test
Cloning into 'clone-test'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0Receiving objects: 87% (469/539), 6.38 MiB | 12.77 MiB/s
Receiving objects: 100% (539/539), 7.27 MiB | 12.10 MiB/s, done.
Resolving deltas: 100% (235/235), done.
これでクローンが完了です。
ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。
$ ls
clone-test/ local-pj/ vuecli/
クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。
$ ls -a clone-test
./ .gitignore config/ entrypoint.sh* package.json storage/
../ .ruby-version config.ru Gemfile postcss.config.js test/
.browserslistrc app/ db/ Gemfile.lock public/ tmp/
.git/ babel.config.js docker-compose.yml lib/ Rakefile vendor/
.gitattributes bin/ Dockerfile log/ README.md yarn.lock
.gitなどの隠しディレクトリやファイルもきちんとコピーされています。
これで、該当のディレクトリでコミット履歴も参照することができます。
ディレクトリパスと名前を指定してリモートレポジトリを丸ごと展開する場合
コマンドの内容
git cloneでは第2引数でディレクトリパスを指定することで、指定したディレクトリにリモートレポジトリを丸ごと展開することができます。
現在のディレクトリじゃなくて、一階層上や一階層下などに新しくディレクトリを作成したい場合に使えます。
git clone <リモートレポジトリのURL> <ディレクトリのパス>
実例
例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。
$ ls
local-pj/ vuecli/
一つ上の階層に新たに「new_dir」というディレクトリを作成して、その中に、リモートレポジトリ名 rails-testをクローンします。(URL: https://github.com/xxxxx/rails-test.git)
第2引数で「../new_dir」を指定します。
$ git clone https://github.com/xxxxx/rails-test.git ../new_dir
Cloning into '../new_dir'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0
Receiving objects: 100% (539/539), 7.27 MiB | 11.19 MiB/s, done.
Resolving deltas: 100% (235/235), done.
これでクローンが完了です。
ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。
#一つ上の階層に移動
$ cd ..
$ ls
vue/ new_dir/
クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。
$ ls -a new_dir
./ .gitignore config/ entrypoint.sh* package.json storage/
../ .ruby-version config.ru Gemfile postcss.config.js test/
.browserslistrc app/ db/ Gemfile.lock public/ tmp/
.git/ babel.config.js docker-compose.yml lib/ Rakefile vendor/
.gitattributes bin/ Dockerfile log/ README.md yarn.lock
.gitなどの隠しディレクトリやファイルもきちんとコピーされています。
これで、該当のディレクトリでコミット履歴も参照することができます。
ローカルレポジトリの内容をコピーする
コマンドの内容
あまり知られていませんが、ローカルレポジトリの内容をクローンすることもできます。
その際は第1引数でローカルレポジトリのパスを指定します。
git clone <ローカルレポジトリのパス> <コピー先ディレクトリのパス>
実例
例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。
$ ls
local-pj/ vuecli/
一つ上の階層に新たに「new_dir」というディレクトリを作成して、その中に、ローカルレポジトリ「local-pj」というディレクトリを作成し、ファイル一式をコピーします。
第2引数で「../new_dir/local-pj」を指定します。
$ git clone local-pj ../new_dir/local-pj
Cloning into '../new_dir/local-pj'...
done.
これでクローンが完了です。
現在のディレクトリを確認すると対象のローカルレポジトリはそのまま存在しているのがわかります。
$ ls
local-pj/ vuecli/
一つ上の階層のディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。
#一つ上の階層に移動
$ cd ..
$ ls
vue/ new_dir/
#new_dirの中身を確認
$ ls new_dir
local-pj/
new_dirのディレクトリの中に、local-pjというディレクトリが生成されています。
クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。
$ ls -a new_dir/local-pj
./ ../ .git/ .gitignore babel.config.js package.json package-lock.json public/ README.md src/
.gitなどの隠しディレクトリやファイルもきちんとコピーされています。
これで、該当のディレクトリでコミット履歴も参照することができます。
補足
なお、ローカルレポジトリのクローンは単純にディレクトリをコピーしただけなので以下の処理と同じです。
cp -r <コピー元のディレクトリパス> <コピー先のディレクトリパス>
-rオプションは--recursive
のショートオプションで、ディレクトリの深い階層も含めて再帰的にコピーするという意味です。
指定したディレクトリが既に存在する場合はエラーになる
クローン先に指定したディレクトリに既に同じ名前のディレクトリ名がある場合は、「fatal: destination path ‘生成するディレクトリ名’ already exists and is not an empty directory.」というエラーが表示されます。
実例
$ git clone git@github.com:xxx/git-test.git
fatal: destination path 'git-test' already exists and is not an empty directory.
対処法
既に同じ名前のディレクトリ名がありますというエラー「fatal: destination path ‘生成するディレクトリ名’ already exists and is not an empty directory.」が表示された場合は以下で対応します。
ローカルに登録されるリモートレポジトリ名
git cloneすると、指定したリモートレポジトリが「origin」というエイリアス(別名)でリモートレポジトリに登録されます。
登録されているリモートレポジトリ名とURLを確認するには git remote -v
を実行します。
$ git remote -v
origin https://github.com/xxxxx/レポジトリ名.git (fetch)
origin https://github.com/xxxxx/レポジトリ名.git (push)
なお、ローカルレポジトリをクローンした場合は、URLではなくディレクトリパスが登録されています。
$ git remote -v
origin C:/Users/hlaup/Documents/projects/xxxxx/レポジトリ名 (fetch)
origin C:/Users/hlaup/Documents/projects/xxxxx/レポジトリ名 (push)