是否可以在不先检查整个存储库的情况下进行稀疏检出?

dro*_*del 159 git

我正在使用包含大量文件的存储库,这需要几个小时才能结账.我正在研究Git是否能够很好地使用这种类型的存储库,因为它支持稀疏检出,但我能找到的每个示例都执行以下操作:

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Run Code Online (Sandbox Code Playgroud)

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

错误:稀疏结账不会在工作目录上留下任何条目

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

ape*_*arr 155

请注意,此答案确实从存储库下载了完整的数据副本.该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
Run Code Online (Sandbox Code Playgroud)

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

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

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout
Run Code Online (Sandbox Code Playgroud)

如果你不这样做,你将在稀疏结帐文件中获得引号,它将无法正常工作

  • 这个简单的对我来说不起作用 - "git remote"命令导致整个回购被检出 - bam! - 就在那时; 所以"git config ..."和以下命令中感兴趣的子目录的规范没有任何效果.在"git remote"命令中指定的repo URL是否只是顶级.git文件的路径?或者它应该成为利益子目录的路径? (35认同)
  • `git remote add`命令下载所有内容,因为这是`-f`所做的 - 告诉它在你定义稀疏结账选项之前立即获取.但是省略或重新排序并没有帮助.稀疏检出仅影响工作树,而不影响存储库.如果您希望您的存储库改变饮食习惯,那么您需要查看`--depth`或`--single-branch`选项. (22认同)
  • 这是一个简化的版本(不需要手动创建目录,执行init和远程添加,只需使用@onionjake提到的--no-checkout选项执行正常的git clone + checkout循环):git clone --no-checkout <project> cd <project> echo <dir >>> .git/info/sparse-checkout git checkout <branch> (10认同)
  • 我不能使用命令"git checkout [branchname]"(也发现错误:稀疏结账不会在工作目录上留下任何条目).我用过"git pull origin master",它运行正常. (3认同)
  • 使用linux上的git版本1.7.2.5,我得到了以下结果:echo'dir/*'仅检出**dir /中的文件,但不检查其子目录中的文件; echo'dir /'(没有asterix!)正确检查dir /下的整个树.HTH (2认同)

Ale*_*nko 56

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
# they are checked out immediately after this command, no need to run git pull
Run Code Online (Sandbox Code Playgroud)

请注意,它需要安装 git 2.25 版。在此处阅读更多相关信息:https : //github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/

更新:

上面的git clone命令仍然会克隆具有完整历史记录的 repo,但不会检出文件。如果不需要完整的历史记录,可以在命令中添加--depth参数,如下所示:

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它在 2.27 版本中的工作方式不同 - 我不知道为什么。 (7认同)
  • 我想我在 2.28 上做到了这一点: `git clone &lt;url&gt; --no-checkout &lt;dir&gt; cd dir git稀疏-checkout set &lt;git dir to checkout&gt; git checkout master` 最后一个结帐用我的文件填充我的工作目录&lt;结帐目录&gt; 中需要 (3认同)
  • 事实证明,这个答案中的行为是一个错误,并且在 git 2.27+ 中不起作用。请参阅/sf/ask/4369674431/ (2认同)

oni*_*ake 39

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

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

git clone <path>
Run Code Online (Sandbox Code Playgroud)

对此:

git clone --no-checkout <path>
Run Code Online (Sandbox Code Playgroud)

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

  • @JasonS问题是关于不做结账的问题.如果你不想要那么整个历史记录在git clone上使用`--depth <depth>`选项.这只会从历史记录中下载最后一个`<depth>`提交.目前没有办法用git部分下载单个提交,但如果你的遥控器支持它,你可以使用`git archive --remote`来下载部分文件集. (9认同)
  • 是的,它不进行结账,但仍然可以下载整个回购历史记录 (5认同)

sou*_*ica 18

我有一个类似的用例,除了我只想检查标签的提交并修剪目录.使用--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>
Run Code Online (Sandbox Code Playgroud)

  • --depth 1被称为浅层克隆,只是FYI. (3认同)

小智 10

我从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
Run Code Online (Sandbox Code Playgroud)

我稍微改变了命令的顺序,但似乎没有任何影响.关键是在步骤5中路径末尾存在尾部斜杠"/" .

  • 你确定这是你想要的吗?-f表示获取所有数据,您仍然可以获得所需的所有其他信息,而且速度很慢.(这仍然是"检查整个存储库") (3认同)

exp*_*ert 9

可悲的是,以上都没有为我工作,所以我花了很长时间尝试不同的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/*
/*
Run Code Online (Sandbox Code Playgroud)

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


使它工作的关键是添加/*文件夹的名称后.

我有git 1.9

  • 稀疏检出仅影响工作树.它们不会影响存储库大小或获取的内容.如果需要,您需要不同的选项. (5认同)
  • 不,它仍然下载所有提交,所有提交和所有文件,git 2.3.2 (3认同)

Von*_*onC 9

2020 年更新答案:

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

nicano回答说明了它的用法:

git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib
Run Code Online (Sandbox Code Playgroud)

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

原答案:2016

git 2.9(2016 年 6 月)将--no-checkout选项概括为git worktree add(该命令允许为一个 repo使用多个工作树

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

git worktree手册页现在包括:

--[no-]checkout:
Run Code Online (Sandbox Code Playgroud)

默认情况下,add检查出来<branch>,但--no-checkout可以用来抑制结账为了使自定义,如配置稀疏结帐


Faw*_*med 9

适用于 git 2.28

git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>
git sparse-checkout init --cone
Run Code Online (Sandbox Code Playgroud)

指定要克隆的文件和文件夹

git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,花了一个小时寻找*简洁*的答案,这是最新的,并且*有效。* (4认同)
  • 这是递归的吗? (2认同)

Qam*_*mar 6

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

做到这一点的好方法

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
Run Code Online (Sandbox Code Playgroud)
  1. -r HEAD将仅下载最新修订版,忽略所有历史记录。

  2. 注意行李箱和/特定文件夹

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

于2019年9月26日更新

  • 请注意,这不是 git 提供的开箱即用的东西,而是 Git**hub** 提供的与常规 Git 产品相邻的东西。但是,当您可以使用它时,它的效果会非常好。谢谢! (2认同)

小智 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]
Run Code Online (Sandbox Code Playgroud)


Axe*_*ert 6

基于此答案apenwarr此评论Miral我想出了以下解决方案克隆时救了我近94%的磁盘空间的linux git仓库在本地,而只想要一个文档子目录:

$ cd linux
$ du -sh .git .
2.1G    .git
894M    .
$ du -sh 
2.9G    .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
 * branch              master     -> FETCH_HEAD
 * [new branch]        master     -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May  3 14:12 Documentation/
$  du -sh .git .
181M    .git
100K    .
$  du -sh
182M    .
Run Code Online (Sandbox Code Playgroud)

所以我从 2.9GB 降到了 182MB,这已经很安静了。

我虽然没有让它git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test此处提示)一起使用,因为然后丢失的文件都作为已删除的文件添加到索引中。所以如果有人知道git clone --filter=blob:nonefor的等价物git fetch,我们可能可以节省更多的兆字节。(阅读手册页git-rev-list也暗示有类似的东西--filter=sparse:path=…,但我也没有让它起作用。

(所有尝试都使用来自 Debian Buster 的 git 2.20.1。)


nic*_*ono 5

在 git 2.27 中,git稀疏结帐看起来已经进化了。这个答案中的解决方案的工作方式并不完全相同(与 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
Run Code Online (Sandbox Code Playgroud)

这些命令效果更好:

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
Run Code Online (Sandbox Code Playgroud)

另请参阅:git-clone --sparsegit-sparse-checkout add