😺

Git Clone メモ

2022/11/16に公開1

Git リポジトリを Clone するのにいくつか方法がある。それのメモ書き

元: GIT のアップデートから考える開発手法の潮流 -- speakerdeck.com

Scalar

Git コマンドを速くさせるやつ。遅い理由は、リポジトリにあるファイルが大きすぎるため Clone に時間がかかる、ファイル数が多いので git status に時間がかかる、などといった感じで遅くなる。

遅さの対処として、Repository Clone は Blobless Clone 機能 を使って、オブジェクトの初期取得範囲を絞っている、Clone後も Sparse-checkout 機能 を使って必要なディレクトリを絞ったり、予めGit管理下にあるファイルを File System Monitor 機能 により事前に計算している。

Clone

普通に開発する分には Full-Clone で、過去の分を含めた全件を取得してくる。だが、リポジトリ内容がでかい、CIで動かすので過去の分は不要、などといった理由で HEAD しか使わないときもある。開発で使うが、でかいので時間がかかる場合は Git2.38 で入った新しい機能の scalar を使うのがいいっぽい

Full Clone

> git clone <repo>

全部取得。普通に使うやつ。

Blobless Clone

> git clone --filter=blob:none <repo>

HEAD のオブジェクトを取得し、Commit とそれらの Tree も取得するが、Head以外のBlob (ファイルの中身)は取得しない。

ScalarでCloneすると、これが使われるっぽい。

Treeless Clone( Partial CLone )

> git clone --filter=tree:0 <repo>

HEAD のオブジェクトは全部取得して、Commitも取得するが、過去のツリーとブロブは取得しない。開発で使うのは非推奨。

Shallow Clone

> git clone --depth=1 --single-branch --branch=main <repo>

この git-clone だと HEAD のオブジェクトのみ 取得する。Github で zip ダウンロードした感じ。利用は非推奨。

Discussion

at yasuat yasu

あー……でもこれ、サーバ側/ホスティング側が対応してるかが関係してる。

BitBucket は現在(2022/11/16)未対応

Github は対応してる

Github Laravel/Framework clone check

フルでダウンロード

 ⚓  ~/tmp  /usr/bin/time git clone  git@github.com:laravel/framework.git laravel-full
Cloning into 'laravel-full'...
remote: Enumerating objects: 272125, done.
remote: Counting objects: 100% (424/424), done.
remote: Compressing objects: 100% (228/228), done.
remote: Total 272125 (delta 216), reused 315 (delta 148), pack-reused 271701
Receiving objects: 100% (272125/272125), 68.38 MiB | 6.34 MiB/s, done.
Resolving deltas: 100% (191077/191077), done.
       16.98 real         4.68 user         1.22 sys

--filter=blob:none

 ⚓  ~/tmp  /usr/bin/time git clone --filter=blob:none git@github.com:laravel/framework.git laravel
Cloning into 'laravel'...
remote: Enumerating objects: 211206, done.
remote: Counting objects: 100% (331/331), done.
remote: Compressing objects: 100% (167/167), done.
remote: Total 211206 (delta 171), reused 252 (delta 116), pack-reused 210875
Receiving objects: 100% (211206/211206), 28.05 MiB | 8.96 MiB/s, done.
Resolving deltas: 100% (135014/135014), done.
remote: Enumerating objects: 2057, done.
remote: Counting objects: 100% (1584/1584), done.
remote: Compressing objects: 100% (1471/1471), done.
remote: Total 2057 (delta 453), reused 126 (delta 113), pack-reused 473
Receiving objects: 100% (2057/2057), 6.12 MiB | 4.27 MiB/s, done.
Resolving deltas: 100% (506/506), done.
Updating files: 100% (2174/2174), done.
       12.70 real         2.06 user         0.83 sys