Git sparse-checkout を試してみる

まずはどんな感じなのか見てみましょう。

Git sparse-checkout とは?

gitにおいて、特定のディレクトリのみをcloneしてくる機能のことです。この機能そのものは v2.6.0 (2015年) から存在しているようですが、 v2.25.0 からコマンドラインから使用できるようになっているとのことです。

この機能を使用すると、monorepo (様々なソフトウェアを1つのリポジトリにまとめて管理すること) での開発体験がより便利になるでしょう。

では、sparce-checkout するのとしないのとを比較してみましょう。

今までどおりの clone

$ git clone https://github.com/derrickstolee/sparse-checkout-example sparce-checkout-example-full
Cloning into 'sparce-checkout-example-full'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 1901 (delta 1), reused 11 (delta 1), pack-reused 1887
Receiving objects: 100% (1901/1901), 170.91 MiB | 8.56 MiB/s, done.
Resolving deltas: 100% (181/181), done.
Updating files: 100% (1560/1560), done.

$ du --summarize --human-readable sparce-checkout-example-full/
364M	sparce-checkout-example-full/

cloneした結果のディレクトリのサイズは 364 MBでした。

sparce-checkout直後

$ git clone --no-checkout https://github.com/derrickstolee/sparse-checkout-example sparce-checkout-example-sparced
Cloning into 'sparce-checkout-example-sparced'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 1901 (delta 1), reused 11 (delta 1), pack-reused 1887
Receiving objects: 100% (1901/1901), 170.91 MiB | 8.19 MiB/s, done.
Resolving deltas: 100% (181/181), done.

$ du --summarize --human-readable sparce-checkout-example-sparced/
172M	sparce-checkout-example-sparced/

$ cd sparce-checkout-example-sparced/
$ ls -al
合計 12
drwxr-xr-x 3 lico lico 4096  330 20:31 .
drwxr-xr-x 4 lico lico 4096  330 20:31 ..
drwxr-xr-x 8 lico lico 4096  330 20:31 .git

clone直後のディレクトリのサイズは172 MBで、ディレクトリの中には .git 以外になにもありません。

$ git sparse-checkout init --cone
$ ls -al
合計 24
drwxr-xr-x 3 lico lico 4096  330 20:35 .
drwxr-xr-x 4 lico lico 4096  330 20:31 ..
drwxr-xr-x 8 lico lico 4096  330 20:35 .git
-rw-r--r-- 1 lico lico 1162  330 20:35 LICENSE.md
-rw-r--r-- 1 lico lico 1200  330 20:35 README.md
-rw-r--r-- 1 lico lico  396  330 20:35 bootstrap.sh

gitディレクトリ下で git sparse-checkout init --cone を実行することで、リポジトリルートに存在するファイルのみが見られるようになりました。

(git clone --sparce <url> という方法もあり、こちらは試したところ、 sparce-checkout init --coneまで済んだ状態のリポジトリができていました)

特定のディレクトリをsparce-checkoutしてみる

この状態で、git sparse-checkout set client/android を実行してみます。

$ git sparse-checkout set client/android
$ ls
LICENSE.md  README.md  bootstrap.sh  client

$ ls client/
README  android

$ ls -a client/android/
.  ..  .gitignore  README.md  app.js  auth.js  config.js  images  package-lock.json  package.json  static  views

すると、 client/android というディレクトリが出現しました。

今後、部分的なcheckoutが便利になっていくと、例えばあるサービスに関係するコードは全部1つのリポジトリで管理するようになる、のように、これまでのリポジトリ分割のベストプラクティスが変遷していくかもしれませんね。

この記事が気に入ったらサポートをしてみませんか?