从 GitHub 存储库下载单个文件夹或目录Download a single folder or directory from a GitHub repo

Download a single folder or directory from a GitHub repo

提问人:g_inherit 提问时间:8/18/2011 最后编辑:Bitswazskyg_inherit 更新时间:11/10/2023 访问量:1558548

问:

如何仅从 GitHub 上托管的远程 Git 存储库下载特定文件夹或目录?

假设示例 GitHub 存储库位于此处:

[email protected]:foobar/Test.git

其目录结构:

Test/
├── foo/ 
│   ├── a.py
│   └── b.py   
└── bar/
    ├── c.py
    └── d.py

我只想下载 foo 文件夹,而不克隆整个测试项目。

git 文件 github 目录 存储库

评论

13赞 Declan Cook 11/5/2013
我使用 svn checkout 为此编写了一个 shell 脚本 - github.com/Decad/github-downloader
812赞 Alexander 7/14/2014
有人可以向我解释为什么没有“官方”的 Web 界面解决方案吗?这似乎是一个微不足道的功能,但非常有用。
4赞 stackdave 10/11/2017
查看@janos答案 SVN 替代方案是最好的,无需身份验证,无需注册,无需限制,无需插件
3赞 VahidN 6/17/2015
我创建了一个名为 GitHubFolderDownloader 的开源项目。它允许您下载存储库的单个文件夹,而无需克隆或下载整个存储库。
7赞 Avinash Thakur 1/22/2022
@Alexander 有官方的方式。查看我的答案 stackoverflow.com/a/70729494/11218031

答:

25赞 michel-slm 8/18/2011 #1

你不能;与 Subversion 不同,Subversion 的每个子目录都可以单独签出,而 Git 则在整个存储库的基础上运行。

对于需要更细粒度访问的项目,您可以使用子模块——每个子模块都是一个单独的 Git 项目,因此可以单独克隆。

可以想象,Git 前端(例如 GitHub 的 Web 界面或 gitweb)可以选择为您提供一个界面来提取给定的文件夹,但据我所知,它们都没有这样做(尽管它们确实允许您下载单个文件,因此如果该文件夹不包含太多文件,则可以选择)

编辑 - GitHub 实际上通过 SVN 提供访问权限,这将允许您执行此操作(根据评论)。有关如何执行此操作的最新说明,请参阅 https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away

评论

0赞 g_inherit 8/18/2011
github API 有什么东西吗?
9赞 araqnid 8/18/2011 #2

您可以对目录树进行简单的下载:

git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -

但是,如果你打算检查它,并且能够进行提交并将它们推回去,不,你不能这样做。

评论

1赞 g_inherit 8/18/2011
无效的命令: 'git-upload-archive 'foobar/Test.git'' 您似乎正在使用 ssh 克隆 git:// URL。确保未设置 core.gitProxy 配置选项和 GIT_PROXY_COMMAND 环境变量。fatal:远程端意外挂起 tar:这看起来不像 tar 存档 tar:由于以前的错误,正在退出并显示故障状态
0赞 Uli Köhler 11/5/2014
@g_inherit我可以重现这个问题。虽然这可能是正确的方向,但这个答案是无效的。
0赞 bhaskarc 12/21/2014
尽管有这么多反对票,但这是唯一对我有用的建议。
18赞 johnny 8/18/2011 #3

如果你真的只想“下载”文件夹而不是“克隆”它(用于开发),那么简单地获取最新版本的存储库(以及其中的文件夹/文件)的副本的最简单方法,而不需要克隆整个存储库甚至首先安装 git,是下载一个 zip 存档(对于任何存储库, fork、branch、commit 等)通过转到 GitHub 上所需的 repository/fork/branch/commit(例如 获取文件的副本,就像它们在特定提交后一样),然后选择右上角附近的按钮。http(s)://github.com/<user>/<repo>/commit/<Sha1>Downloads

这种存档格式不包含任何 git-repo 魔术,只包含跟踪文件本身(如果它们被跟踪,也许还有一些 .gitignore 文件,但您可以忽略这些:p) - 这意味着如果代码发生变化并且您想保持顶部,您将不得不手动重新下载它,这也意味着您将无法将其用作 git 存储库......

不确定这是否是您在这种情况下要寻找的(再次,“下载”/查看与“克隆”/开发),但它仍然很有用......

评论

10赞 JD Smith 9/6/2013
如果未看到下载链接,请确保位于主存储库页面(而不是子目录)上。似乎您只能下载整个存储库的 zip。此外,这个 github 帮助页面可能很有用。
3赞 Andy Thomas 4/10/2015
轻松点击访问。易于获得先前版本。轻松从下载的zip中拉出所需的文件夹。谢谢。
2赞 Krisztian 8/13/2017
要从中下载的通用 URL:tar.gzhttps://github.com/${owner}/${repo}/archive/${hash}.tar.gz
5赞 Manish Shrivastava 1/24/2013 #4

这是 SVN 优于 Git 的少数几个地方之一。

最后,我们倾向于三个选项:

  1. 使用 wget 从 GitHub 获取数据(使用原始文件视图)。
  2. 让上游项目将所需的数据子集发布为生成工件。
  3. 放弃并使用完整的结帐。它在第一个版本中很受欢迎,但除非你获得大量流量,否则在接下来的版本中不会有太大的麻烦。

评论

5赞 Rob Howard 9/27/2013
好吧,与其说是 Git 与 Subversion,不如说是 GitHub 完全不允许 git-archive。(我很想知道为什么。
98赞 RobW 4/13/2013 #5

对于通用 git 存储库:

如果你想下载文件,而不是克隆带有历史记录的存储库,你可以用 git-archive 来做到这一点。

git-archive 创建 git 存储库的压缩 zip 或 tar 存档。一些使它与众不同的地方:

  1. 您可以选择要存档的 git 存储库中的文件或目录。
  2. 它不会存档文件夹,也不会存档运行该文件夹的存储库中任何未跟踪的文件。.git/
  3. 您可以存档特定的分支、标记或提交。使用 git 管理的项目通常使用它来生成项目版本(beta、release、2.0 等)的存档供用户下载。

从使用 ssh 连接到的远程存储库创建目录存档的示例:docs/usage

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar

有关详细信息,请参阅此博客文章git 文档

GitHub 存储库上的注意事项:

GitHub 不允许 git-archive 访问。☹️

评论

2赞 DEWA Kazuyuki - 出羽和之 4/17/2018
git archive --format tar格式不是 tar.gz,而是 tar。
0赞 Felipe Costa 8/3/2018
这应该是最好的答案
6赞 bitfox 3/8/2019
我认为这是最好的答案,但请注意,git archive 命令不适用于 https 协议。
0赞 mihai 8/22/2019
@yukihane从 tar.gz 到 tar 的编辑扩展,希望 OP 能加入这个
0赞 Guillermo 8/16/2022
可以跳过 tar 文件的创建。| tar -x
1727赞 nick 8/13/2013 #6

2021 年 4 月更新:社区创建了一些工具可以为您执行此操作:

注意:如果您尝试下载大量文件,则可能需要为这些工具提供令牌以避免速率限制。


原始(手动)方法:原生不支持签出单个目录,但 Github 可以通过 SVN 做到这一点。如果你用 subversion 签出你的代码,Github 基本上会在后端将 repo 从 git 转换为 subversion,然后提供请求的目录。git

以下是使用此功能下载特定文件夹的方法。我将以流行的 javascript 库为例。lodash

  1. 导航到要下载的文件夹。让我们从分支下载。/testmastergithub repo URL example

  2. 修改 subversion 的 URL。替换为 。tree/mastertrunk

    https://github.com/lodash/lodash/tree/master/test

    https://github.com/lodash/lodash/trunk/test

  3. 下载文件夹。转到命令行并获取带有 SVN 的文件夹。

svn checkout https://github.com/lodash/lodash/trunk/test

您可能不会立即看到任何活动,因为 Github 最多需要 30 秒才能转换更大的存储库,因此请耐心等待。

完整的URL格式说明:

  • 如果您对 branch 感兴趣,请改用。所以完整的路径是mastertrunktrunk/foldername
  • 如果您对 branch 感兴趣,请改用。这 完整路径如下所示foobranches/foobranches/foo/foldername
  • 提示:如果您愿意,可以在下载前查看可用的标签和分支svn ls

就这样!Github 还支持更多的 subversion 功能,包括对提交和推送更改的支持。

评论

17赞 Grault 12/19/2013
我修改了它以使用 ,因为我不想要一个 Subversion 工作副本。然后我在 Git 中添加了生成的文件夹。(我不知何故丢失了一大块目录树,所以我从我分叉的存储库中导出。svn export
8赞 nick 10/26/2014
@num3ric- 很抱歉回复晚了,但您应该能够将“trunk”替换为“branches/yourbranch”
2赞 john 9/5/2015
我正在使用 TortoiseSVN 的命令。我确定我以与答案中所示类似的格式提供了正确的 URL。我什至尝试使用可视化检查器并选择了所需的文件夹(未键入 URL),结果相同。Import
4赞 evaldeslacasa 6/18/2020
截至 2020 年 6 月 18 日仍然运行良好 - 使用 TortoiseSVN 下载了 Windows 10 上给定分支中的特定文件夹 - >导出功能(可右键单击任何文件资源管理器目录),使用此 URL:https://github.com/$organization/$repo/branches/$branch/$directory
9赞 Hugo 10/28/2020
截至 2020 年 10 月 28 日,如果您尝试该方法,您将收到状态 410,功能消失。repo/branches/foo_branch/bar_folder
196赞 janos 8/20/2013 #7

如果有 ,则可以使用以下方法执行此操作:svnsvn export

svn export https://github.com/foobar/Test.git/trunk/foo

请注意 URL 格式:

  • 基本 URL 是https://github.com/
  • /trunk在末尾附加

在运行之前,最好先使用以下命令验证目录的内容:svn export

svn ls https://github.com/foobar/Test.git/trunk/foo

评论

0赞 john 9/4/2015
这仍然有效吗?用 TortiseSVN 尝试过这个,我收到一个权限错误,要求我提供凭据。
2赞 nick 10/23/2015
@john 我敢肯定这为时已晚,无法提供多大帮助,但您的 GitHub 帐户是否启用了 2 因素身份验证?如果是这样,我想我在某处读到您必须使用预先生成的密钥作为密码(您需要在 GitHub 设置中找到该密钥)。
1赞 jgrocha 2/21/2016
关于URL格式,您可以保留扩展名。您可以使用完整项目链接,然后使用项目完整路径。例:。要只导出一个文件夹,只需添加所需的路径,例如 .更容易保持项目路径不变。.gitsvn lssvn ls https://github.com/RobTillaart/Arduino.git/trunksvn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib
0赞 janos 2/21/2016
@jgrocha我不确定它在 2013 年是否以这种方式工作,但现在确实如此,所以谢谢,更新了帖子
1赞 Rockallite 3/10/2017
举个例子:要下载中的内容,请运行 .将在当前工作目录下创建一个名为的目录。只有源文件,没有别的。没有,没有与颠覆相关的文件。https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgisvn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgiwsgi.git
6赞 John Washburn 12/12/2014 #8

为了放大上面的答案,从真实的 GitHub 存储库到本地目录的一个真实示例是:

svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces

svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces  /temp/SvnExport/Washburn

有时,一个具体的例子有助于澄清所提议的替代方法。

31赞 Mohammed Jafar 5/14/2015 #9

无论谁在处理特定文件夹,他都需要克隆该特定文件夹本身,为此,请使用稀疏签出按照以下步骤操作。

  1. 创建目录。

  2. 初始化 Git 存储库。(git init)

  3. 启用稀疏结帐。(git config core.sparsecheckout true)

  4. 告诉 Git 你想要哪些目录(echo 2015/brand/May(参考你想处理的文件夹)>>.git/info/sparse-checkout)

  5. 添加遥控器 (git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. 获取文件 (git pull origin master )

评论

0赞 Kalyan 8/27/2016
太糟糕了,这个评论没有得到足够的赞成票。看起来提供的解决方案适用于所有 git 存储库,而不仅仅是 github 存储库。
11赞 Chris 1/5/2017
不过,这实际上并没有达到预期。它仍然克隆整个存储库,只是没有签出某些文件夹。
0赞 J K 11/18/2017
在这里解决:stackoverflow.com/questions/4114887/...
0赞 orangecaterpillar 4/6/2020
我收到此错误:稀疏结帐在工作目录上不留下任何条目。
9赞 zeeawan 6/3/2015 #10

另一个具体的例子:

就像我想从 url 下载“iOS Pro Geo”文件夹一样

https://github.com/alokc83/APRESS-Books-Source-Code-/ tree/master/%20Pro%20iOS%20Geo

我可以通过以下方式做到这一点

svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

注意路径中的中继

编辑:(根据 Tommie C 的评论)

是的,使用 export 而不是 checkout 会提供一个干净的副本,而无需额外的 git 存储库文件。

svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

编辑:如果 url 中没有 tree/master,则 Fork 它,它将在 Forked url 中。

评论

2赞 Tommie C. 9/13/2015
如果您只想下载文件夹的副本而不是结帐,只需将结帐更改为导出。
0赞 hsafarya 11/10/2016
谢谢你的回答,我们可以潜水一个分支吗?假设我想下载 feature1 分支的 aaa 文件夹
36赞 Tommie C. 9/13/2015 #11

其他答案没有错,但我只是想为那些第一次在这个过程中徘徊的人分享分步说明。

如何从 github 存储库 (Mac OS X) 下载单个文件夹:

~ 要打开终端,只需单击聚光灯并键入终端,然后按回车键

  1. 在 Mac 上,您可能已经拥有 SVN(要测试,只需打开终端和 键入“svn”“which svn”~不带引号)
  2. 在 Github 上:通过单击存储库中的特定文件夹名称,找到 git 文件夹(而不是存储库)的 Github 路径
  3. 从浏览器的地址栏中复制路径
  4. 打开终端并键入:svn export
  5. 接下来粘贴地址(例如):https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. 替换单词:tree/master
  7. 带字:trunk
  8. 键入文件的目标文件夹(在本例中,I 将目标文件夹存储在 Downloads 文件夹中 当前用户)
  9. 这里的空格只是空格键,而不是单词(空格)~/Downloads/HeadsUpUI
  10. final 终端命令显示下载 文件夹(将地址与步骤 5 进行比较) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~/Downloads/HeadsUpUI

顺便说一句 - 如果您使用的是 Windows 或其他平台,您可以在 http://subversion.apache.org 找到 subversion (svn) 的二进制下载

~ 如果你想签出文件夹而不是简单地下载它,请尝试使用 svn 帮助(tldr: replace export with checkout)

更新

关于恢复中断的下载/结帐的评论。我会尝试跑步,然后是.请搜索 SO 以获取其他选项。svn cleanupsvn update

评论

1赞 Miguel 6/8/2017
我必须从特定文件夹下载许多文件,并在下载过程中出现此错误: svn: E175002: REPORT of '/bgmartins/scripts-parlamento/!svn/vcc/default': 200 OK (github.com) 你如何恢复下载?
0赞 Heath Raftery 3/22/2019
为我工作。真是太神奇了。
0赞 Curious2learn 3/25/2021
了不起!效果很好!
4赞 Mohsen Abasi 9/20/2015 #12

若要从 GitHub 导出目录,请将目录 url 中的“/tree/master/”替换为“/trunk/”。

例如,要从以下 URL 导出目录:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

运行以下命令:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet
688赞 Kino 11/17/2015 #13

此功能有两个选项:

选项 1:GitZip 浏览器扩展

Chrome扩展程序, 边缘扩展程序, Firefox插件

用法:

  1. 浏览任何 Github 存储库页面。
  2. 两种下载方式:
    1. 选择项目:
      1. 默认情况下,您可以双击项目或选中项目前面的复选框。
      2. 单击页面右下角的下载按钮。
    2. 在上下文菜单中:
      1. 单击“GitZip下载”>“整个存储库”或“当前文件夹”。
      2. 将鼠标光标移到该项目上,然后单击“GitZip下载”>“选定的文件夹/文件”。
      3. 单击“GitZip下载”>执行2-1-1后“选中的项目”。
  3. 查看进度仪表板并等待浏览器触发器下载。
  4. 获取 ZIP 文件。

获取令牌:

  1. 单击浏览器上的 GitZip 扩展图标。
  2. 单击“获取令牌”旁边的“正常”或“私人”链接。
  3. 在 Github 身份验证页面上授予 GitZip 权限。
  4. 回到开头的回购页面。
  5. 继续使用。

选项 2:Github gh-page

使用 GitHub API 和 JSZip、FileSaver .js库进行 http://kinolien.github.io/gitzip

Step1:在右上角的字段中输入 github url。
Step2:按回车键或单击下载直接下载zip或单击搜索查看子文件夹和文件列表。
Step3:单击“下载Zip文件”或“获取文件”按钮以获取文件。

在大多数情况下,它工作正常,除了文件夹包含超过 1,000 个文件,因为 Github Trees API 限制。(参考 Github API#Contents)

如果您有 GitHub 帐户并使用此站点中的“获取令牌”链接,它还可以支持私有/公共存储库并升级速率限制。

评论

1赞 Kino 8/25/2016
@MYounas 请参阅 Github API 文档中的 OAuth、树、Blobs 章节,并使用 JSZip、FileSaver.js js 库实现 gitzip。
1赞 Ray Hulha 12/15/2016
目前坏了?
1赞 Ray Hulha 12/16/2016
我试图在 win 10 上使用当前的 chrome 获得 github.com/vsch/flexmark-java/tree/master/flexmark/src/main/,但它只是挂了。
2赞 goldylucks 1/26/2017
有人会对执行此操作的 chrome 扩展程序感兴趣吗?
1赞 Kino 6/28/2017
@goldylucks我这样做了,看看新的答案。
3赞 Yogesh Chawla 1/12/2016 #14

我们的团队编写了一个 bash 脚本来做到这一点,因为我们不想在我们的裸机服务器上安装 SVN。

https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh

它使用 github API,可以从命令行运行,如下所示:

git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs
1127赞 Minhas Kamal 8/11/2016 #15

转到 DownGit >输入您的 URL >下载!

您可以直接DownGit 下载或创建任何 GitHub 公共目录或文件的下载链接-


DownGit


您还可以配置下载文件的属性 - 详细用法


免責聲明:我陷入了与提问者相同的问题,找不到任何简单的解决方案。所以,我先开发了这个工具供自己使用,然后打开给大家:)

评论

28赞 Minhas Kamal 8/20/2016
基本方法是 - 1。获取目录链接(使用 angular-route),2。转到 GitHub API,3。搜索目录并下载所有文件, 4.用它创建一个zip文件(我用过jszip)并将其保存为文件(为此使用了filesaver)。为了清楚理解,我建议看看我的项目
11赞 Ring 1/26/2018
这很酷,但它不适用于自动化工具(如 wget)
4赞 James Hubert 5/10/2022
DownGit 正是我所需要的:从存储库下载特定文件夹,而无需创建新的 git 目录(就像 subversion 方法所要求的那样)。非常感谢您制作此内容。
1赞 unstuck 11/23/2022
谢天谢地,我们不需要莱昂纳多·达·芬奇从 Github 下载文件夹
3赞 jsBug 12/20/2022
这既简单又有用(- :
3赞 aesede 10/10/2016 #16

我使用的是 CentOS 7 服务器,我没有 root 访问权限,也没有 git、svn 等(也不想! 所以制作了一个 python 脚本来下载任何 github 文件夹: https://github.com/andrrrl/github-folder-downloader

用法很简单,只需从 github 项目中复制相关部分,假设该项目 https://github.com/MaxCDN/php-maxcdn/,并且您想要一个只有某些源文件的文件夹,那么您需要执行以下操作:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(如果不存在,将创建目标文件夹)

它需要lxml库,可以安装如果你
没有root访问权限(像我一样),你可以在你的目录中创建一个文件,里面有这些内容: 并且会正常工作(参考:https://stackoverflow.com/a/33464597/591257)。
easy_install lxml.pydistutils.py$HOME [install] user=1 easy_install lxml

5赞 user1088530 1/15/2017 #17

我使用linux所以,把它放在~/.bashrc中,甚至称为:D $HOME/.bashrc

git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}

}

然后刷新 shell

source ~/.bashrc 

然后将它与 git-downloadfolder blablabla 一起使用:D

14赞 Willem van Ketwich 6/19/2018 #18

有一个名为 Python3 pip 的包可以做到这一点*:githubdl

export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo

项目页面在这里

* 免责声明:我写了这个包。

评论

0赞 Ruben Dario Guarnizo Martinez 3/14/2021
感谢您分享此软件包,我在 COLAB 环境中提供了帮助
0赞 GTodorov 4/25/2021
你拿到了我的 1 美元。谢谢!
7赞 Calvin 7/13/2018 #19

在我的情况下,没有一个答案有帮助。如果您正在为 Windows 进行开发,您可能没有 svn。在许多情况下,也不能指望用户安装 Git,或者出于其他原因不想下载整个存储库。一些回答这个问题的人,如威廉·范·凯特维奇(Willem van Ketwich)和阿兹塔克(aztack),制作了完成这项任务的工具。但是,如果该工具不是针对您正在使用的语言编写的,或者您不想安装第三方库,则这些工具将不起作用。

但是,有一种更简单的方法。GitHub 有一个 API,允许您使用 GET 请求下载单个文件或整个目录的内容。您可以使用返回 JSON 对象的目录来访问该目录,该对象枚举了该目录中的所有文件。枚举中包含指向文件原始内容(参数)的链接。然后,可以使用该 URL 下载该文件。https://api.github.com/repos/:owner/:repo_name/contents/:pathdownload_url

这是一个两步过程,需要能够发出 GET 请求,但这几乎可以在任何平台上以任何语言实现。它可用于获取文件或目录。

评论

1赞 scopchanov 12/7/2020
这仅适用于单个文件。OP 要求提供一种下载文件夹的方法,而 for 文件夹是 .在发布答案之前,请仔细阅读问题。download_urlnull
11赞 Albin 8/22/2018 #20

如果您熟悉 unix 命令,则不需要特殊的依赖项或 Web 应用程序。您可以将存储库下载为压缩包,并仅解压缩您需要的内容。

示例(来自 fontawesome 子目录的 woff2 文件):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • 有关链接格式的更多信息:https://developer.github.com/v3/repos/contents/#get-archive-link(包括如何获取 zip 文件或特定分支/引用)
  • 保留路径 () 的初始部分以匹配任何目录。Github 创建了一个包装器目录,名称中带有 commit ref,因此无法知道它。*/
  • 您可能希望与路径中的斜杠 () 数量相同(上一个参数)。--strip-components/

这将下载整个压缩包。如果必须避免这种情况,或者如果您想对 GitHub 服务器友好,请使用其他答案中提到的 SVN 方法。

32赞 Ciro Santilli OurBigBook.com 6/8/2019 #21

git clone --filter仅下载所需的文件夹

例如,仅克隆此存储库子目录所需的对象:https://github.com/cirosantilli/test-git-partial-clone-big-small 忽略包含大文件的子目录,我可以:small/big/

git clone -n --depth=1 --filter=tree:0 \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git sparse-checkout set --no-cone small
git checkout

该选项是与远程协议的更新一起添加的,它确实可以防止从服务器下载对象。--filter

我已经在以下位置更详细地介绍了这一点:如何仅克隆 Git 存储库的子目录?

2021 年 1 月在 git 2.30.0 上测试。

评论

0赞 Ciro Santilli OurBigBook.com 6/8/2019
@VonC我想我打败了你一次:stackoverflow.com/questions/2466735/......我只在发布 XD 后才看过它!当然,我今天在 2.22 发布后谷歌搜索了一下,当然所有答案都已经更新了;-)它永远不会停止让我感到有趣,为什么总是有另一个半重复的,总是,我最终在一年后以略有不同的查询找到了它。不过,我不打算在 git 上打败你,太难了,但要注意死灵法师的数量!哈哈
0赞 Ciro Santilli OurBigBook.com 6/8/2019
当然,@VonC开玩笑,我显然也赞成你的东西。我现在只需要想办法把这些积分兑换成钱 XD
0赞 The Fool 2/1/2023
这需要很长时间。它单独获取 d1 中的每个文件。
0赞 Ciro Santilli OurBigBook.com 2/1/2023
@TheFool我在测试存储库上得到的时间相似,请告诉我您是否有精确的测试存储库 + 命令。
1赞 Ciro Santilli OurBigBook.com 2/1/2023
@TheFool好的,我复制了,谢谢。这个答案包含一个过时的命令,我的主要答案是:stackoverflow.com/questions/600079/......有正确的。有了它,它是瞬间的。更新。git checkoutgit sparse-checkout set
22赞 jabacchetta 11/29/2019 #22

2019年总结

有多种方法可以处理此问题,具体取决于您是要手动还是以编程方式执行此操作。

下面总结了四个选项。对于那些喜欢更实际解释的人,我整理了一个 YouTube 视频:从 GitHub 下载单个文件和文件夹

此外,我在 StackOverflow 上发布了类似的答案,供那些需要从 GitHub 下载单个文件(而不是文件夹)的人使用。


1. GitHub 用户界面

  • 存储库的主页上有一个下载按钮。当然,这会下载整个存储库,之后您需要解压缩下载内容,然后手动拖出所需的特定文件夹。

2. 第三方工具

  • 有各种浏览器扩展和 Web 应用程序可以处理这个问题,DownGit 就是其中之一。只需将 GitHub URL 粘贴到文件夹(例如)并按“下载”按钮即可。https://github.com/babel/babel-eslint/tree/master/lib

3. 颠覆

  • GitHub 不支持 git-archive(允许我们下载特定文件夹的 git 功能)。但是,GitHub 确实支持各种 Subversion 功能,我们可以将其中一个功能用于此目的。Subversion 是一个版本控制系统(git 的替代品)。您需要安装 Subversion。获取要下载的文件夹的 GitHub URL。不过,您需要修改此 URL。您需要指向存储库的链接,后跟单词“trunk”,并以嵌套文件夹的路径结尾。换句话说,使用我上面提到的相同文件夹链接示例,我们将“tree/master”替换为“trunk”。最后,打开一个终端,导航到您希望将内容下载到的目录,键入以下命令(将 URL 替换为您构造的 URL):,然后按 Enter。svn export https://github.com/babel/babel-eslint/trunk/lib

4. GitHub API 接口

  • 如果要以编程方式完成此任务,则需要此解决方案。这实际上是 DownGit 在引擎盖下使用的。使用 GitHub 的 REST API 编写一个脚本,用于向内容终结点执行 GET 请求。端点可以按如下方式构造:.替换占位符后,示例端点为:。这将为您提供该文件夹中存在的所有内容的 JSON 数据。数据包含所需的一切,包括内容是文件夹还是文件、下载 URL(如果是文件)和 API 终结点(如果是文件夹)(以便您可以获取该文件夹的数据)。使用此数据,脚本可以递归遍历目标文件夹中的所有内容,为嵌套文件夹创建文件夹,并下载每个文件夹的所有文件。查看 DownGit 的代码以获取灵感。https://api.github.com/repos/:owner/:repo/contents/:pathhttps://api.github.com/repos/babel/babel-eslint/contents/lib
10赞 V3K3R 12/11/2019 #23

您可以通过以下方式使用 git-svn。

首先,替换为 然后,安装tree/mastertrunkgit-svnsudo apt install git-svn

git svn clone https://github.com/lodash/lodash/trunk/test

这样你就不必经历设置 svn 的痛苦,特别是对于 Windows 用户。

评论

0赞 JOSEPH Blessingh 3/17/2020
谢谢。我可以保证它适用于 Windows。不过在 gcloud 上不起作用。它说 git: 'svn' 不是命令
4赞 clubby789 3/31/2020
sudo apt install git-svn在通过 WSL 运行时是必需的。
5赞 Pinecone 1/25/2020 #24

无论出于何种原因,该解决方案对我不起作用,而且由于我不需要其他任何东西,因此花时间尝试制作它没有意义,因此我使用已有的工具寻找一个简单的解决方案。此脚本仅使用 和 下载描述为 的 GitHub 目录中的所有文件。svnsvncurlawk"/:user:repo/contents/:path"

对 GitHub REST API 命令的调用的返回正文将返回一个对象,该对象包含目录中每个文件的链接。"GET /repos/:user:repo/contents/:path""download_url"

此命令行脚本使用该 REST API 调用该 REST API,并通过 AWK 发送结果,AWK 会过滤掉除“download_url”行之外的所有行,从链接中删除引号和逗号,然后使用另一个对 curl 的调用下载链接。curl

curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
     '/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'

评论

0赞 Botspot 9/23/2020
我明白了awk: cmd. line:1: /download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); } awk: cmd. line:1: ^ syntax error
0赞 shawn 3/22/2021
与此命令等效的批处理:FOR /F delims^=^"^ tokens^=4 %%a IN ('curl -s https://api.github.com/repos/:user/:repo/contents/:path 2^>NUL ^| findstr "download_url"') DO curl -O "%%~a"
6赞 Sorry IwontTell 3/15/2020 #25

只需 5 个步骤

  • 这里下载 SVN
  • 打开 CMD 并转到 SVN bin 目录,如下所示:cd %ProgramFiles%\SlikSvn\bin
  • 假设我想下载这个目录 URL
    https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples
  • 将 或 替换为tree/developtree/mastertrunk
  • 现在触发最后一个命令以下载同一目录中的文件夹。
svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples
9赞 ford04 5/16/2020 #26

git sparse-checkout

Git 2.25.0 包含一个新的实验性命令,使现有功能更易于使用,并为大型存储库提供一些重要的性能优势。(GitHub 博客git sparse-checkout)

当前版本的示例:

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

尤其是

  • --sparse 仅将存储库的顶级目录文件签入到工作副本中git
  • git sparse-checkout add t以增量方式添加/检出tgit

其他元素

  • git sparse-checkout init 做了一些准备工作来启用部分检出
  • --filter=blob:none通过仅下载必要的 Git 对象来优化数据获取(有关详细信息,请查看部分克隆功能
  • --cone 还通过应用更受限制的文件包含模式来提高性能

GitHub 状态

GitHub 仍在内部评估此功能,同时在选定的几个存储库上启用此功能 [...]。随着该功能的稳定和成熟,我们将随时向您通报其进展情况。(文档)

评论

0赞 Ciro Santilli OurBigBook.com 10/27/2020
git sparse checkout不是严格需要的,至少现在不是了。 单独也只获取丢失的 Blob:stackoverflow.com/a/56504849/895245git checkout
3赞 Pankaj Patidar 10/22/2020 #27

通过在 url 中将 github 替换为 githubbox 打开 codesandbox 的存储库,然后在 codesandbox 上转到文件菜单并将其导出为 zip。

对于以下存储库:https://github.com/geist-org/react/tree/master/examples/custom-themes

输入以下网址: https:// githubbox.com/geist-org/react/tree/master/examples/custom-themes

在 codesandbox 中,转到文件菜单并将其导出为 Zip。

11赞 Meir Gabay 1/27/2021 #28

这就是我使用 git v2.25.0 的方式,也使用 v2.26.2 进行了测试。此技巧不适用于 v2.30.1

顶级域名

git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
cd opencv

# requires git 2.25.x to 2.26.2
git sparse-checkout set data/haarcascades

您可以使用 Docker 来避免安装特定版本的 git

git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
cd opencv

# requires git 2.25.x to 2.26.2
docker run --rm -it -v $PWD/:/code/ --workdir=/code/ alpine/git:v2.26.2 sparse-checkout set data/haarcascades

完整的解决方案

# bare minimum clone of opencv
$ git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
...
Resolving deltas: 100% (529/529), done.

# Downloaded only ~7.3MB , takes ~3 seconds
# du = disk usage, -s = summary, -h = human-readable
$ du -sh opencv
7.3M    opencv/

# Set target dir
$ cd opencv
$ git sparse-checkout set data/haarcascades
...
Updating files: 100% (17/17), done.
# Takes ~10 seconds, depending on your specs

# View downloaded files
$ du -sh data/haarcascades/
9.4M    data/haarcascades/
$ ls data/haarcascades/
haarcascade_eye.xml                      haarcascade_frontalface_alt2.xml      haarcascade_licence_plate_rus_16stages.xml  haarcascade_smile.xml
haarcascade_eye_tree_eyeglasses.xml      haarcascade_frontalface_alt_tree.xml  haarcascade_lowerbody.xml                   haarcascade_upperbody.xml
haarcascade_frontalcatface.xml           haarcascade_frontalface_default.xml   haarcascade_profileface.xml
haarcascade_frontalcatface_extended.xml  haarcascade_fullbody.xml              haarcascade_righteye_2splits.xml
haarcascade_frontalface_alt.xml          haarcascade_lefteye_2splits.xml       haarcascade_russian_plate_number.xml

引用

评论

2赞 Akito 8/1/2022
为什么它不适用于?v2.30.1
0赞 Glenn 'devalias' Grant 11/10/2022
在我刚才的快速测试中,我只需要在运行后做一个,它似乎只拉下了我指定的单个文件夹。2.38.1git checkout maingit sparse-checkout set foo
7赞 mohd.akram 2/20/2021 #29

您可以将 ghget 与从地址栏复制的任何 URL 一起使用:

ghget https://github.com/fivethirtyeight/data/tree/master/airline-safety

这是一个独立的可移植 shell 脚本,不使用 SVN(这在大型存储库上对我不起作用)。它也不使用 API,因此不需要令牌,也没有速率限制。

免责声明:我做到了。

81赞 Avinash Thakur 1/16/2022 #30

在尝试了所有答案之后,对我来说最好的解决方案是:

GitHub 的基于 vscode 的编辑器。

优点:

  1. 不需要任何额外的工具,如 API 令牌。svn
  2. 内容大小无限制
  3. 另存为目录或文件,而不是存档。

指示

  1. 转到任何存储库。(例 https://github.com/RespiraWorks/Ventilator/tree/master/software)
  2. 按 URL 或替换为 在 GitHub 的内部编辑器中打开存储库..com.dev
  3. 在窗格(左侧或按 ++)中,右键单击所需的文件/文件夹,然后选择下载。ExplorerCtrlShiftE
  4. 在对话框中,选择磁盘上要存在所选文件/文件夹的目录。Select Folder

注意

我尝试了其他解决方案,例如接受的答案,但是,

  1. 不想只为此安装和学习。svn
  2. 其他工具,如 Download DirectoryRefined GitHubGitZipDownGit 要么需要 API 令牌,要么无法下载大型目录。

其他选项

  • 带有远程存储库扩展名的 VSCode 打开存储库并下载文件/文件夹。

评论

2赞 i30817 2/16/2022
这实际上不适用于目录(不再?Microsoft似乎已经削弱了这一点,只“上传”到目录,只下载文件。
12赞 Avinash Thakur 2/18/2022
@i30817我找到了原因。在检查代码时,此功能似乎使用了仅在 chrome/edge/chromium 86+ 和 opera 中可用的 API(developer.mozilla.org/en-US/docs/Web/API/Window/...)。如果您使用的是其他设备,则可能无法下载这些文件夹。
2赞 i30817 2/18/2022
这个数字,我使用的是 firefox。哦,好吧,我不再需要它,因为我的具体情况有另一种解决方案。
1赞 sultanmyrza 3/7/2022
截至 2022 年 3 月 7 日,它仍然有效。我喜欢这种方法,因为当你把一个链接放到另一个服务器,使你成为一个zip文件时,该服务器有可能附加恶意的东西。
2赞 Tonnie 8/16/2022
作品如魅力 2022年8月