Dựa trên câu trả lời này của apenwarr và nhận xét này của Miral, tôi đã đưa ra giải pháp sau đây giúp tôi tiết kiệm gần 94% dung lượng đĩa khi sao chép kho lưu trữ linux git cục bộ trong khi chỉ muốn một thư mục con Tài liệu:
$ cd linux
$ du -sh .git .
2.1G .git
894M .
$ du -sh
2.9G .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May 3 14:12 Documentation/
$ du -sh .git .
181M .git
100K .
$ du -sh
182M .
Vì vậy, tôi đã giảm từ 2.9GB xuống còn 182 MB, nó khá yên tĩnh.
Mặc dù tôi đã không làm cho nó hoạt động với git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( gợi ý ở đây ) vì sau đó tất cả các tệp bị thiếu đã được thêm dưới dạng các tệp đã xóa vào chỉ mục. Vì vậy, nếu bất cứ ai biết tương đương git clone --filter=blob:none
với git fetch
, chúng ta có thể tiết kiệm thêm một vài megabyte. (Đọc trang người đàn ông git-rev-list
cũng gợi ý rằng có một cái gì đó giống như --filter=sparse:path=…
, nhưng tôi cũng không làm cho nó hoạt động.
(Tất cả đã thử với git 2.20.1 từ Debian Buster.)