我正在使用一个存储库,其中有大量的文件,需要几个小时才能签出。我正在研究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命令将导致以下错误:

错误:稀疏签出在工作目录上没有留下条目

如何在不先签出所有文件的情况下进行稀疏签出?


当前回答

痛苦的奥罗拉

git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>

指定要克隆的文件夹

git sparse-checkout add <folder1> <folder2>
git checkout

其他回答

我是新的git,但似乎如果我做每个目录的git签出,然后它工作。同样,稀疏签出文件需要在每个目录后面都有一个斜杠。有人更有经验,请确认这将工作。

有趣的是,如果签出不在稀疏签出文件中的目录,似乎没有什么区别。它们不会显示在git状态中,git read-tree -m -u HEAD不会导致它被删除。Git reset -hard也不会导致目录被删除。有没有更有经验的人愿意评论一下git对签出但不在稀疏签出文件中的目录的看法?

我从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将通过截断提交历史来进一步提高克隆速度,但它可能会导致以下总结的问题。

痛苦的奥罗拉

git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>

指定要克隆的文件夹

git sparse-checkout add <folder1> <folder2>
git checkout

请注意,这个答案确实从存储库下载了数据的完整副本。git remote add -f命令将克隆整个存储库。从git-remote的手册页:

使用-f选项,在远程信息设置完成后立即运行git fetch <name>。


试试这个:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

现在你会发现你有一个“修剪”签出,只有从路径/within_repo/到/desired_subdir的文件存在(并且在该路径中)。

注意,在windows命令行中,你不能引用路径,也就是说,你必须用这个命令来改变第6个命令:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

如果您不这样做,您将在稀疏签出文件中获得引号,并且它将不起作用

在我的例子中,我想在克隆项目时跳过Pods文件夹。我像下面这样一步一步地做,这对我很有用。 希望能有所帮助。

mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true 
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master

备注:如果你想跳过更多文件夹,只需在稀疏签出文件中添加更多行。