Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

posted at

Organization

Gitコマンド sparse-checkout使ってみた

はじめに

 先日、社内の古参プロジェクトをいじる機会があり、リポジトリをcloneしようとしたら巨大過ぎたので、いじりたい一部分だけcloneできないかと調べると都合の良いコマンドがあったので使ってみました。

git sparse-checkout

 昔から存在はしていたコマンドですが、ここ数年で改修も入り使いやすくなってるのではないかと思います。

・Git 1.7
2010年2月 リリース
git sparse-checkout 導入
・Git 2.25
2020年1月 リリース
git sparse-checkout 機能改善
Highlights from Git 2.25 - The GitHub Blog
・Git 2.26
2020年3月 リリース
git sparse-checkout add 追加
Highlights from Git 2.26 - The GitHub Blog

使ってみた

 試しにphpフレームワーク phalcon のリポジトリをcloneしようと思います。clone対象は docker/8.0 に絞って行います。gitのバージョンは2.32.0を使用します。

$ git --version
git version 2.32.0
$ mkdir -p qiita
$ cd qiita
$ git init .
$ git config core.sparsecheckout true ### sparsecheckoutを有効にします。
$ cat .git/config ### config確認
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
    sparsecheckout = true
$ echo "/docker/8.0" > .git/info/sparse-checkout ### 対象ディレクトリ指定
$ cat .git/info/sparse-checkout
/docker/8.0
$ git remote add origin git@github.com:phalcon/cphalcon.git ### リモートリポジトリの追加
$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
    sparsecheckout = true
[remote "origin"]
    url = git@github.com:phalcon/cphalcon.git
    fetch = +refs/heads/*:refs/remotes/origin/*
$ git pull origin master ### 取り込んでみる
remote: Enumerating objects: 231468, done.
remote: Counting objects: 100% (19901/19901), done.
remote: Compressing objects: 100% (7433/7433), done.
remote: Total 231468 (delta 14489), reused 16454 (delta 12247), pack-reused 211567
Receiving objects: 100% (231468/231468), 185.47 MiB | 2.49 MiB/s, done.
Resolving deltas: 100% (182723/182723), done.
From github.com:phalcon/cphalcon
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> origin/master
$ tree . ### pullしたディレクトリ構造確認
.
└── docker
    └── 8.0
        ├── Dockerfile
        └── extra.ini

2 directories, 2 files

感想

 狙い通り特定のディレクトリ配下のみ取り込むことができました。一部のディレクトリが肥大化し、その影響でリポジトリ全体が重くなっているプロジェクトも少なくないと思いますので、使い方次第では有効なツールになると思います。
 懸念点としては下記のように .git/objects/ 配下のボリュームはそれほど変わらないという点です。git上の歴史はすべて取り込んだうえで、一部ディレクトリのみをpullしているだけのようなので、歴史あるリポジトリに対して行う場合は、pullする際にそれなりの時間がかかると思います。

### 今回のsparse-checkoutを使用した場合
du -sh .git/objects/
198M    .git/objects/

### 通常通りフルでcloneした場合
$ du -sh.git/objects/
199M    .git/objects/

参考

Highlights from Git 2.25 - The GitHub Blog
Highlights from Git 2.26 - The GitHub Blog
Phalconリポジトリ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?