207

我正在使用一个包含大量文件的存储库,需要数小时才能签出。我正在研究 Git 是否可以很好地与这种存储库一起工作,因为它支持稀疏签出,但我能找到的每个示例都执行以下操作:

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

这个命令序列的问题是原始克隆也进行了检查。如果将 -n 添加到原始克隆命令,则 read-tree 命令会导致以下错误:

错误:稀疏结帐在工作目录上没有留下任何条目

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

4

15 回答 15

167

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

现在你会发现你有一个“修剪”的结帐,只有来自 path/within_repo/to/desired_subdir 的文件存在(并且在那个路径中)。

请注意,在 windows 命令行上,您不能引用路径,即您必须使用以下命令更改第 6 个命令:

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

如果你不这样做,你会在稀疏结帐文件中得到引号,它不会工作

于 2011-02-05T19:49:17.677 回答
73

In 2020 there is a simpler way to deal with sparse-checkout without having to worry about .git files. Here is how I did it:

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

Note that it requires git version 2.25 installed. Read more about it here: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/

UPDATE:

The above git clone command will still clone the repo with its full history, though without checking the files out. If you don't need the full history, you can add --depth parameter to the command, like this:

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1
于 2020-03-17T19:27:56.807 回答
45

Git clone 有一个选项 (--no-checkout-n) 可以满足您的需求。

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

git clone <path>

对此:

git clone --no-checkout <path>

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

于 2014-07-29T20:00:46.917 回答
29

我有一个类似的用例,除了我只想签出标签的提交并修剪目录。Using--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>
于 2017-03-05T20:30:07.883 回答
21

Works in git 2.28

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

Specify the files and folders you want to clone

git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout
于 2020-09-08T01:58:46.760 回答
12

我从 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 步中路径末尾是否存在尾部斜杠“/” 。

于 2015-08-28T14:59:21.743 回答
10

遗憾的是,上述方法都不适合我,所以我花了很长时间尝试不同的sparse-checkout文件组合。

就我而言,我想跳过带有 IntelliJ IDEA 配置的文件夹。

这是我所做的:


git clone https://github.com/myaccount/myrepo.git --no-checkout

git config core.sparsecheckout true

.git\info\sparse-checkout使用以下内容创建

!.idea/*
!.idea_modules/*
/*

运行 'git checkout --' 以获取所有文件。


使其工作的关键是/*在文件夹名称之后添加。

我有 git 1.9

于 2014-09-30T20:45:23.790 回答
9

2020 年更新答案:

现在有一个命令git sparse-checkout,我在Git 2.25(2020 年第一季度)中详细介绍了它

nicono回答说明了它的用法:

git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

随着 Git 2.27的发展而发展,并且知道如何“重新应用”稀疏结帐,如这里
请注意,使用 Git 2.28,git status会提到您在稀疏签出存储库中


注意/警告:某些在非锥形模式下有效的稀疏检出模式会导致锥形模式下的段错误,这已在 Git 2.35(2022 年第一季度)中得到纠正。

参见Derrick Stolee ( ) 的提交 a3eca58提交 391c3a1提交 a481d43(2021 年 12 月 16 日(由Junio C Hamano 合并 -- --09481fe 提交中,2022 年 1 月 10 日)derrickstolee
gitster

sparse-checkout: 拒绝添加不良模式

审核人:Elijah Newren
签字人:Derrick Stolee

在锥模式稀疏检出时,如果现有的稀疏检出文件与锥模式模式不匹配,则不清楚 ' git sparse-checkout' ( man ) add ... 应该如何表现。
将行为更改为失败,并显示有关现有模式的错误消息。

此外,所有锥形模式模式都以 ' /' 字符开头,因此添加该限制。
这对于我们的示例测试“锥形模式:错误模式警告”是必要的,但还需要修改我们用来测试与识别锥形模式模式相关的警告的示例稀疏检查文件。

此错误检查将导致测试脚本进一步失败,因为测试添加了非锥形模式模式而不清理它们。
现在执行该清理作为测试的一部分。


在 Git 2.36(2022 年第二季度)中,“ git sparse-checkoutman希望使用每个工作树的配置,但在附加到裸存储库的工作树中效果不佳。

请参阅Derrick Stolee ( ) 的提交 3ce1138提交 5325591提交 7316dc5​​提交 fe18733提交 615a84a提交 5c11c0d(2022 年 2 月 7 日(由Junio C Hamano 合并——提交 6249ce2中,2022 年 2 月 25 日)derrickstolee
gitster

worktree:在添加时复制稀疏结帐模式和配置

签字人:Derrick Stolee
审核人:Elijah Newren

添加新工作树时,可以合理地预期我们希望为该新工作树使用当前的稀疏签出设置集。
这对于工作树变得太大而无法使用的存储库尤其重要。
这在使用部分克隆时更为重要,因为我们希望避免为不应写入新工作树的文件下载丢失的 blob。

在没有扩展完整工作树的中间步骤的情况下创建这样一个工作树的唯一方法是在 ' git worktree add' ( man )期间复制稀疏签出模式和配置设置。
每个工作树都有自己的稀疏检出模式,当稀疏检出文件丢失时,默认行为是在 HEAD 包含所有路径。
因此,我们需要从某个地方获得模式,它们也可能是当前工作树的模式。
然后在将来独立修改这些。

除了 sparse-checkout 文件,如果启用了工作树配置并且该文件存在,则复制工作树配置文件。
这将复制所有重要设置,以确保新工作树的行为与当前工作树相同。
我们必须继续做出的唯一例外是,core.bare并且core.worktree应该在工作树的配置文件中取消设置。


原答案:2016

git 2.9(2016 年 6 月)将把--no-checkout选项推广到git worktree add(允许为一个 repo 使用多个工作树的命令)

请参阅Ray Zhang ( )的提交 ef2a0ac(2016 年 3 月 29 日) 。 帮助者:Eric Sunshine ( )Junio C Hamano ( )(由Junio C Hamano 合并 -- --0d8683c 提交中,2016 年 4 月 13 日)OneRaynyDay
sunshinecogitster
gitster

git worktree手册页现在包括:

--[no-]checkout:

但是,默认情况下,addcheck out可用于禁止 checkout 以进行自定义,例如配置 sparse-checkout<branch>--no-checkout

于 2016-04-14T06:30:27.120 回答
8

是的,可以下载一个文件夹而不是下载整个存储库。甚至任何/最后一次提交

这样做的好方法

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
  1. -r HEAD 只会下载最新版本,忽略所有历史。

  2. 注意主干和/特定文件夹

复制和更改 URL 之前和之后/trunk/。我希望这会对某人有所帮助。享受 :)

更新于 2019 年 9 月 26 日

于 2016-06-09T20:01:30.177 回答
7
于 2019-05-03T13:14:35.107 回答
6

仅稀疏结帐特定文件夹的步骤:

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]
于 2019-01-05T18:59:32.180 回答
4

我是 git 的新手,但似乎如果我为每个目录执行 git checkout 则它可以工作。此外,稀疏签出文件需要在每个目录之后都有一个斜杠,如所示。请有更多经验的人确认这将起作用。

有趣的是,如果您签出不在 sparse-checkout 文件中的目录,它似乎没有任何区别。它们不会出现在 git status 中,并且 git read-tree -m -u HEAD 不会导致它被删除。git reset --hard 也不会导致目录被删除。任何更有经验的人愿意评论 git 对已签出但不在稀疏签出文件中的目录的看法?

于 2010-11-06T20:09:17.173 回答
3

In git 2.27, it looks like git sparse checkout has evolved. Solution in this answer does not work exactly the same way (compared to git 2.25)

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
# they are checked out immediately after this command, no need to run git pull

These commands worked better:

git clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

See also : git-clone --sparse and git-sparse-checkout add

于 2020-07-20T16:24:10.137 回答
2

I took this from TypeScript definitions library @types:

Let's say the repo has this structure:

types/
|_ identity/
|_ etc...

Your goal: Checkout identity/ folder ONLY. With all its contents including subfolders.

⚠️ This requires minimum git version 2.27.0, which is likely newer than the default on most machines. More complicated procedures are available in older versions, but not covered by this guide.

git clone --sparse --filter=blob:none --depth=1 <source-repo-url>
git sparse-checkout add types/identity types/identity ...

This will check out the types/identity folder to your local machine.

--sparse initializes the sparse-checkout file so the working directory starts with only the files in the root of the repository.

--filter=blob:none will exclude files, fetching them only as needed.

--depth=1 will further improve clone speed by truncating commit history, but it may cause issues as summarized here.

于 2021-02-20T07:52:04.487 回答
1

In my case, I want to skip the Pods folder when cloning the project. I did step by step like below and it works for me. Hope it helps.

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

Memo, If you want to skip more folders, just add more line in sparse-checkout file.

于 2020-02-20T10:05:43.877 回答