我正在使用包含大量文件的存储库,这需要几个小时才能结帐。我正在研究Git是否能够很好地使用这种存储库,因为它支持稀疏检出,但我能找到的每个例子都有以下几点:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
这一系列命令的问题是原始克隆也执行结帐。如果将-n添加到原始克隆命令,则read-tree命令会导致以下错误:
错误:稀疏结账不会在工作目录中留下任何条目
如何在不先检出所有文件的情况下进行稀疏结账?
答案 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 ef2a0ac见Ray Zhang (OneRaynyDay
)(2016年3月29日)
帮助:Eric Sunshine (sunshineco
)和Junio C Hamano (gitster
)
(由Junio C Hamano -- gitster
--合并于commit 0d8683c,2016年4月13日)
--[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
-r HEAD只下载最后修订版,忽略所有历史记录。
注意 trunk 和/ specific-folder
享受:)
方法2
上述方法均不适合我。这就是我做的......
对于Windows用户下载并安装SlikSvn_x84,请添加此&#34; C:\ Program Files(x86)\ SlikSvn \ bin&#34;到Path环境变量。 mac用户使用替代svn客户端。
使用命令行:svn export https://github.com/foobar/Test.git/trunk/foo
请注意网址格式:
基本网址为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 answer和apenwarr的this comment和Miral的hinted 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-test
(log_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
答案 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
备注,如果要跳过更多文件夹,只需在稀疏签出文件中添加更多行即可。