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

时间:2010-11-06 19:52:06

标签: git

我正在使用包含大量文件的存储库,这需要几个小时才能结帐。我正在研究Git是否能够很好地使用这种存储库,因为它支持稀疏检出,但我能找到的每个例子都有以下几点:

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

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

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

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

15 个答案:

答案 0 :(得分:142)

请注意,此答案会从存储库下载完整的数据副本。 git remote add -f命令将克隆整个存储库。来自man page of 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 /到/ desired_subdir的文件存在(并且在那条路径中)。

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

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

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

答案 1 :(得分:39)

在2020年,有一种更简单的方式来处理稀疏签出,而不必担心.git文件。这是我的操作方式:

:a

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

更新:

以上s/…/…/命令仍将克隆具有完整历史记录的存储库,尽管不检出文件。如果不需要完整的历史记录,可以向命令添加--depth参数,如下所示:

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

答案 2 :(得分:32)

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

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

git clone <path>

对此:

git clone --no-checkout <path>

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

答案 3 :(得分:15)

我有一个类似的用例,除了我只想检查标签的提交并修剪目录。使用--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>

答案 4 :(得分:10)

我从pavek早先发布的单行中找到了我想要的答案(谢谢!)所以我想在单个回复中提供一个完整的答案,该答案适用于 Linux (GIT 1.7) 0.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

我稍微改变了命令的顺序,但似乎没有任何影响。关键是尾随斜线的存在&#34; /&#34;在步骤5中路径末尾

答案 5 :(得分:8)

可悲的是,以上都没有为我工作,所以我花了很长时间尝试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/*
/*

运行&#39; git checkout - &#39;获取所有文件。


让它发挥作用的关键是在文件夹的名称之后添加/*

我有git 1.9

答案 6 :(得分:5)

git 2.9(2016年6月)将--no-checkout选项概括为git worktree add(允许与multiple working trees for one repo一起使用的命令)

commit ef2a0acRay Zhang (OneRaynyDay)(2016年3月29日) 帮助:Eric Sunshine (sunshineco)Junio C Hamano (gitster) (由Junio C Hamano -- gitster --合并于commit 0d8683c,2016年4月13日)

git worktree man page现在包括:

--[no-]checkout:
  

默认情况下,add会检出<branch>,但--no-checkout可用于禁止结帐以进行自定义,,例如配置稀疏结帐

答案 7 :(得分:4)

我是git的新手,但似乎如果我为每个目录执行git checkout,那么它就可以了。此外,稀疏检出文件需要在每个目录后面都有一个斜杠,如图所示。更多经验,请确认这将有效。

有趣的是,如果你签出一个不在稀疏结账文件中的目录,它似乎没有区别。它们没有显示在git状态和git read-tree -m -u HEAD不会导致它被删除。 git reset --hard也不会导致删除目录。任何更有经验的人都会关注git对已检出但不在稀疏结帐文件中的目录的看法?

答案 8 :(得分:4)

在git 2.28中工作

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

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

git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout

答案 9 :(得分:3)

是的,可以下载文件夹,而不是下载整个存储库。

很好的方式更新10/4/2019

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-a
dapter -r HEAD
  1. -r HEAD只下载最后修订版,忽略所有历史记录。

  2. 注意 trunk 和/ specific-folder

  3. 享受:)

    方法2

    上述方法均不适合我。这就是我做的......

    1. 对于Windows用户下载并安装SlikSvn_x84,请添加此&#34; C:\ Program Files(x86)\ SlikSvn \ bin&#34;到Path环境变量。 mac用户使用替代svn客户端。

    2. 使用命令行:svn export https://github.com/foobar/Test.git/trunk/foo

    3. 请注意网址格式:

      基本网址为https://github.com/ / trunk附加在最后

      示例:svn export https://github.com/gearvrf/GearVRf-Demos.git/trunk/gvr-renderableview

      我希望这会对某人有所帮助。参考:https://stackoverflow.com/a/18324458/5710872

答案 10 :(得分:3)

仅稀疏检出特定文件夹的步骤:

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]

答案 11 :(得分:1)

基于this answerapenwarrthis commentMiralhinted here,我想到了以下解决方案,在克隆linux git存储库时为我节省了将近94%的磁盘空间本地,而只需要一个Documentation子目录:

$ 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    .

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

尽管我没有将它与git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-testlog_google_chrome_gcm)配合使用,因为丢失的文件全部作为已删除文件添加到索引中。因此,如果有人知道git clone --filter=blob:none相当于git fetch,我们可能可以节省更多的兆字节。 (阅读git-rev-list的手册页还暗示着类似--filter=sparse:path=…的内容,但我也没有用。

(全部在Debian Buster上使用git 2.20.1尝试过。)

答案 12 :(得分:1)

在git 2.27中,看起来git sparse checkout已经发展。 this答案中的解决方案不能以完全相同的方式工作(相比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

这些命令效果更好:

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

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

答案 13 :(得分:1)

我从 TypeScript 定义库 @types 中获取了这个:

假设 repo 具有以下结构:

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

您的目标:仅结帐身份/文件夹。包括子文件夹在内的所有内容。

⚠️ 这需要最低 git version 2.27.0,这可能比大多数机器上的默认值更新。旧版本中提供了更复杂的过程,但本指南未涵盖。

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

这会将 types/identity 文件夹检出到您的本地计算机。

--sparse 初始化稀疏签出文件,因此工作目录仅从存储库根目录中的文件开始。

--filter=blob:none 将排除文件,仅在需要时获取它们。

--depth=1 将通过截断提交历史来进一步提高克隆速度,但它可能会导致问题总结为 here

答案 14 :(得分:0)

就我而言,我想在克隆项目时跳过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

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