はんなりと、ゆるやかに

アジャイル、スクラムが好きなITエンジニアが日々から学んだことをアウトプット

Git : shallow clone を使ってcloneを早くしよう

テレワークが始まって家で仕事される方も増えましたね。家のネット環境が弱くてgitのcloneが遅いという声を聞くことがあったのでcloneを早くする方法はないかと調べました。

shallow cloneで取得するコミット数を減らす

git-scm.com

取得するコミット数を減らしてclone する方法はshallow clone と呼ばれます。
取得するコミット数が減るので通信容量も速度も改善されます。

shallow cloneは3種類あります。

  • git clone --depth <コミット数>
  • git clone --shallow-since <日時>
  • git clone --shallow-exclude <リビジョン>

git clone --depth <コミット数>

指定したコミット数分をcloneできるオプションです。最新のコミットだけ必要であれば「 1 」 を指定します。

git clone --depth 1 <リポジトリ> <ディレクトリ>

git clone --shallow-since <日時>

指定した日時以降のコミットがcloneできるオプションです。時間も指定できますが、日にちだけでも指定可能です。

git clone --shallow-since "2020-04-13 12:00:00" <リポジトリ> <ディレクトリ>

git clone --shallow-exclude <リビジョン>

指定したタグより新しいコミットがcloneできるオプションです(タグは含まれない)。
リファレンスドキュメントを読んでも、使い方がなかなか分からなかったコマンドです。リビジョンと書かれていますが、使用できるのはタグ一択だと思いました。

git clone --shallow-since "V1.0" <リポジトリ> <ディレクトリ>

submoduleも shallow clone

submoduleも shallow clone するオプションが shallow-submodules です。
shallow-submodulesオプションは他の設定に関わらずdepth 1 で cloneされます。

git clone --depth 1 --recursive --shallow-submodules <リポジトリ> <ディレクトリ>

shallow clone したあとfetchやpull

shallow clone したあともfetch や pull は可能です。追加でコミットログを取得したい場合はdepthの数を増やすと良いです。

git fetch --depth 2

すべてのコミットログを取得する場合は --unshallow オプションを使います。

git fetch --unshallow

さいごに

  • shallow clone を使用することで必要な部分だけcloneできます
  • shallow clone のあとすべてを取得することもできます