我正在使用一个存储库,其中有大量的文件,需要几个小时才能签出。我正在研究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命令将导致以下错误:
错误:稀疏签出在工作目录上没有留下条目
如何在不先签出所有文件的情况下进行稀疏签出?
我从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将通过截断提交历史来进一步提高克隆速度,但它可能会导致以下总结的问题。
在2020年,有一种更简单的方法来处理稀疏签出,而不必担心.git文件。以下是我的做法:
git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
git checkout # or git switch
注意,它需要安装git 2.25版本。更多信息请点击:https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
更新:
上面的git clone命令仍然会克隆出完整的历史记录,尽管没有检出文件。如果你不需要完整的历史,你可以在命令中添加——depth参数,如下所示:
# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 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将通过截断提交历史来进一步提高克隆速度,但它可能会导致以下总结的问题。