我正在使用一个存储库,其中有大量的文件,需要几个小时才能签出。我正在研究Git是否能很好地使用这种存储库的可能性,因为它支持稀疏签出,但我能找到的每个例子都是这样的:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
这个命令序列的问题是原来的克隆也做一个签出。如果在原来的clone命令中添加了-n,则read-tree命令将导致以下错误:
错误:稀疏签出在工作目录上没有留下条目
如何在不先签出所有文件的情况下进行稀疏签出?
不幸的是,上面没有一个对我有用,所以我花了很长时间尝试不同的稀疏签出文件组合。
在我的情况下,我想跳过IntelliJ IDEA配置的文件夹。
以下是我所做的:
运行git clone https://github.com/myaccount/myrepo.git——no-checkout
执行git config core命令。sparsecheckout真实
创建了.git\info\稀疏签出,包含以下内容
!.idea/*
!.idea_modules/*
/*
运行'git checkout——'获取所有文件。
让它正常工作的关键是在文件夹名称后添加/*。
我有1.9
不幸的是,上面没有一个对我有用,所以我花了很长时间尝试不同的稀疏签出文件组合。
在我的情况下,我想跳过IntelliJ IDEA配置的文件夹。
以下是我所做的:
运行git clone https://github.com/myaccount/myrepo.git——no-checkout
执行git config core命令。sparsecheckout真实
创建了.git\info\稀疏签出,包含以下内容
!.idea/*
!.idea_modules/*
/*
运行'git checkout——'获取所有文件。
让它正常工作的关键是在文件夹名称后添加/*。
我有1.9
根据apenwarr的回答和Miral的评论,我提出了以下解决方案,在本地克隆linux git存储库时节省了近94%的磁盘空间,同时只需要一个文档子目录:
$ 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 .
所以我从2.9GB降到了182MB,这已经很不错了。
我虽然没有得到这个工作与git克隆-深度1 -no-checkout -filter=blob:none file:///…/linux linux-稀疏-测试(这里暗示)然后丢失的文件都作为删除文件添加到索引。因此,如果有人知道等价于git clone——filter=blob:none用于git读取,我们可能可以节省更多兆字节。(阅读git-rev-list的手册页还提示有像——filter=sparse:path=…这样的东西,但我也没有让它工作。
(都是用Debian Buster的git 2.20.1尝试过的。)
我从TypeScript定义库@types中获取了这个:
让我们说回购有这样的结构:
types/
|_ identity/
|_ etc...
您的目标:仅签出标识/文件夹。包括子文件夹在内的所有内容。
⚠️这需要最低git版本2.27.0,这可能比大多数机器上的默认版本更新。更复杂的过程可以在旧版本中使用,但本指南没有涉及。
git clone --sparse --filter=blob:none --depth=1 <source-repo-url>
git sparse-checkout add types/identity types/identity ...
这将检出类型/标识文件夹到您的本地机器。
——sparse初始化稀疏签出文件,以便工作目录只从存储库根目录中的文件开始。
——filter=blob:none将排除文件,只在需要时获取它们。
——depth=1将通过截断提交历史来进一步提高克隆速度,但它可能会导致以下总结的问题。