我正在使用一个存储库,其中有大量的文件,需要几个小时才能签出。我正在研究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 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

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

其他回答

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

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

请注意,这个答案确实从存储库下载了数据的完整副本。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

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

步骤稀疏签出只特定的文件夹:

1) git clone --no-checkout  <project clone url>  
2) cd <project folder>
3) git config core.sparsecheckout true   [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
    [You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]

我从pavek之前发布的一行代码中找到了我一直在寻找的答案(谢谢!),所以我想在一个适用于Linux (GIT 1.7.1)的回复中提供一个完整的答案:

1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master

我稍微改变了命令的顺序,但这似乎没有任何影响。关键在于第5步中路径末尾的斜杠“/”。

Git克隆有一个选项(——no-checkout或-n),可以做你想做的事情。

在您的命令列表中,只需更改:

git clone <path>

:

git clone --no-checkout <path>

然后,您可以使用问题中所述的稀疏签出。