我正在使用一个存储库,其中有大量的文件,需要几个小时才能签出。我正在研究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克隆有一个选项(——no-checkout或-n),可以做你想做的事情。

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

git clone <path>

:

git clone --no-checkout <path>

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

其他回答

在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

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

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

git clone <path>

:

git clone --no-checkout <path>

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

在我的例子中,我想在克隆项目时跳过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

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

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

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

我有一个类似的用例,除了我只想签出一个标记的提交和修剪目录。使用——depth 1可以使它非常稀疏,并且可以加快速度。

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url>  # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>