从GitHub仓库下载单个文件夹或目录

1912

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

例如,GitHub仓库地址如下:

git@github.com:foobar/Test.git

它的目录结构:

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

我想只下载 foo 文件夹而不是克隆整个 Test 项目。


13
我使用svn checkout编写了一个shell脚本,用于下载https://github.com/Decad/github-downloader。 - Declan Cook
815
有人能解释一下为什么没有一个“官方”的网络界面解决方案吗?这似乎是一个简单的功能,但非常有用。 - Alexander
3
我创建了一个开源项目,叫做 GitHubFolderDownloader。它允许你下载存储库的单个文件夹,而无需克隆或下载整个存储库。 - VahidN
4
参见@janos的回答,SVN替代品是最好的选择,无需授权、注册、限制和插件。 - stackdave
7
@Alexander,有一种官方的方法。请查看我的答案 https://dev59.com/Tmw05IYBdhLWcg3wqzis#70729494 - Avinash Thakur
显示剩余2条评论
45个回答

1730
更新于2021年4月:社区已经开发了一些工具,可以为您完成这项任务。 注意:如果您尝试下载大量文件,可能需要向这些工具提供令牌以避免速率限制。

原始(手动)方法:git本身不支持直接检出单个目录,但是Github可以通过SVN来实现此功能。如果你使用Subversion检出代码,Github会在后台将存储库从git转换为subversion,然后提供所请求的目录。

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

  1. 导航到您想要下载的文件夹。让我们从主分支中下载/test文件夹。 github repo URL example

  2. 修改子版本的URL。将tree/master替换为trunk

    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格式解释:

  • 如果您对master分支感兴趣,请改用trunk。因此完整路径为trunk/foldername
  • 如果您对foo分支感兴趣,请改用branches/foo。完整路径类似于branches/foo/foldername
  • 技巧提示:如果希望在下载之前查看可用的标签和分支,可以使用svn ls

就是这样!Github还支持更多的子版本特性,包括提交和推送更改的支持。


17
我修改了这个程序,使用了svn export,因为我不想要一个Subversion的工作副本。然后我将导出的文件夹添加到Git中。(我的目录树中丢失了很大一部分,所以我从我派生的代码库中进行了导出。) - Grault
8
抱歉回复晚了,但你应该可以用“分支/你的分支”来替换“主干(trunk)”。 - nick
2
我正在使用TortoiseSVN的Import命令。我确定我提供了与答案中相似格式的正确URL。我甚至尝试使用可视化检查器并选择所需的文件夹(未键入URL),结果仍然相同。 - john
4
截至2020年6月18日,仍可以使用TortoiseSVN -> Export功能(在任何文件浏览器目录上右键单击即可),在Windows 10上下载给定分支中的特定文件夹。使用以下URL:https://github.com/$organization/$repo/branches/$branch/$directory。请注意,翻译时未进行任何改动,以保持原意。 - evaldeslacasa
9
截至2020年10月28日,如果您尝试使用repo/branches/foo_branch/bar_folder的方法,您将收到状态码410,表示该功能已被删除。 - Hugo
显示剩余27条评论

1129

进入DownGit > 输入您的URL > 下载!

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


DownGit


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


免责声明:我遇到了与提问者同样的问题,找不到简单的解决方法。所以,我首先为自己开发了这个工具,然后向所有人开放了它 :)


28
基本方法是: 1.获取目录链接(使用angular-route), 2.进入GitHub API, 3.浏览目录并下载所有文件, 4.使用它创建一个zip文件 (我使用jszip) 并将其保存为文件(用于此目的filesaver)。为了明确理解,建议查看我的项目 - Minhas Kamal
11
这很酷,但它不能与自动化工具(如wget)一起使用。 - Ring
4
DownGit 恰好满足我的需求:从 repo 中下载特定文件夹,而不需要创建新的 git 目录(类似于 subversion 方法所需的方式)。非常感谢您的制作。 - James Hubert
1
感谢上帝,我们不需要达芬奇才能从Github下载文件夹。 - unstuck
3
这是简单而有帮助的内容 (- : - jsBug
显示剩余16条评论

689

两种选项:

选项1:GitZip浏览器扩展

Chrome扩展程序Edge扩展程序Firefox插件

使用方法:

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

获取Token:

  1. 单击浏览器上的GitZip扩展图标。
  2. 单击“Get Token”旁边的“Normal”或“Private”链接。
  3. 在Github授权页面上授权GitZip权限。
  4. 返回开始时的存储库页面。
  5. 继续使用。

选项2:Github gh-page

使用GitHub API和JSZip、FileSaver.js库,可以通过http://kinolien.github.io/gitzip进行下载ZIP文件。

步骤1:在右上角的字段中输入GitHub URL。
步骤2:按下回车键或点击“下载”按钮可直接下载ZIP文件,或点击“搜索”按钮查看子文件夹和文件列表。
步骤3:单击“下载ZIP文件”或“获取文件”按钮即可获得文件。

通常情况下,它能正常工作,但如果文件夹包含超过1,000个文件,则可能会出现问题,这是由于Github Trees API的限制所致。(请参考Github API#Contents)

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


1
@MYounas 请查看Github API文档中的OAuth、Trees和Blobs章节,并使用JSZip、FileSaver.js等JavaScript库来实现gitzip。 - Kino
2
有没有人对一个能做到这个的Chrome扩展程序感兴趣? - Shining Love Star
1
@AaronFranke 现已上线,快来试试吧! - Kino
1
@xamDev,你能告诉我URL吗? - Kino
1
@Paw 我目前没有计划。也许你可以使用 SVN 或者 Willem 的答案 - Kino
显示剩余16条评论

196

如果您拥有svn,则可以使用svn 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

这还管用吗?我尝试使用TortiseSVN,但出现了权限错误,要求我提供凭据。 - john
2
@john 我相信现在已经太晚了,无法提供太多帮助,但是你的GitHub账户是否启用了双重认证?如果是的话,我认为我在某个地方读到过,你将需要使用预生成的密码来进行身份验证(你需要在GitHub设置中找到这个密码)。 - nick
1
关于URL格式,您可以保留.git扩展名。您可以使用完整的项目链接,并以svn ls开头,后跟项目的完整路径。例如:svn ls https://github.com/RobTillaart/Arduino.git。要仅导出一个文件夹,只需添加/trunk,然后是所需的路径,如svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib。保持项目路径不变更会更容易。 - jgrocha
1
一个例子:要下载 https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi 中的内容,请运行 svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi。一个名为 wsgi 的目录将被创建在当前工作目录下。只有源文件,没有其他东西。没有 .git,也没有与Subversion相关的文件。 - Rockallite
最适合我的最佳选择 - Wilder Pereira
显示剩余2条评论

98

对于一个普通的git存储库:

如果你想下载文件,而不是克隆具有历史记录的存储库,可以使用git-archive命令完成。

git-archive命令可以制作一个包含git存储库的压缩zip或tar档案。以下是一些使其特殊的功能:

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

以下是从您连接到的远程repo中创建一个包含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
git archive --format tar 格式不是 tar.gz,而是 tar。 - DEWA Kazuyuki - 出羽和之
这应该是最好的答案。 - Felipe Costa
6
我认为这是最佳答案,但请注意,git archive 命令不支持 https 协议。 - bitfox
@yukihane将扩展名从tar.gz更改为tar,希望OP已经同意。 - mihai
可以使用 | tar -x 来跳过创建 tar 文件。 - Guillermo

81

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

GitHub 基于 VS Code 的编辑器。

优点:

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

说明

  1. 转到任何 repo。(例如:https://github.com/RespiraWorks/Ventilator/tree/master/software
  2. 按下 . 或将 URL 中的 .com 替换为 .dev,以打开 GitHub 的内部编辑器中的 repo。
  3. 浏览器 窗格中(左侧或按 Ctrl+Shift+E),右键单击所需的文件/文件夹并选择下载。
  4. 选择文件夹 对话框中,选择您想要所选文件/文件夹存在于其中的磁盘目录。

注意

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

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


    2
    这对目录实际上不起作用(不再?)。微软似乎已经削弱了它,只能“上传”到目录并仅下载文件。 - i30817
    12
    我找到了原因。在检查代码时,发现该功能使用了一个API(https://developer.mozilla.org/en-US/docs/Web/API/Window/showDirectoryPicker),仅适用于Chrome/Edge/Chromium 86+和Opera浏览器。如果您使用的是其他浏览器,可能无法下载文件夹。 - Avinash Thakur
    2
    那很好理解,我之前使用的是 Firefox。不过没关系了,因为我的特定问题已经有了另一个解决方案,所以我不再需要它了。 - i30817
    1
    截至2022年3月7日,它仍然有效。我喜欢这种方法,因为当您将链接放到另一个服务器上时,该服务器有可能附加恶意内容。 - sultanmyrza
    2
    2022年8月,运行得十分顺畅。 - Tonnie
    显示剩余5条评论

    36

    其他答案没有问题,但我想分享一下第一次进行此过程的步骤说明。

    如何从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. 键入文件的目标文件夹(在此示例中,我将目标文件夹存储在当前用户的下载文件夹中)
    9. 这里的空格只是空格键而不是(空格)〜/ Downloads / HeadsUpUI单词
    10. 最终的终端命令显示下载文件夹的完整命令(将地址与步骤5进行比较):svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI 〜/ Downloads / HeadsUpUI

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

    如果您想要检出文件夹而不仅仅是下载它,请尝试使用svn帮助(tl;dr:将export替换为checkout)。

    更新

    关于在下载/检出时恢复中断的评论。我建议尝试运行svn cleanup,然后再运行svn update。请搜索SO以获取其他选项。


    1
    我需要从一个特定的文件夹下载许多文件,在下载过程中出现了以下错误:svn: E175002: REPORT of '/bgmartins/scripts-parlamento/!svn/vcc/default': 200 OK (https://github.com)你知道该如何恢复下载吗? - Miguel
    对我有用。太棒了。 - Heath Raftery
    太棒了!运行得非常好! - Curious2learn

    32

    git clone --filter 只下载所需文件夹

    例如,要克隆此存储库子目录 small/ 所需的对象:https://github.com/cirosantilli/test-git-partial-clone-big-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。


    @VonC,这次我想我比你先看到了它:https://dev59.com/WHE95IYBdhLWcg3wE52C#ofPqnYgBc1ULPQZFTo_T,而且是在发布后才看到的XD!当然,今天2.22发布后我也谷歌了一下,所有答案都已经更新了;-)令我惊讶的是,总有另一个半重复的问题留下来,总是会在一年后用稍微不同的查询找到它。虽然我不打算在git上击败你,但要注意necromancer计数!哈哈 - Ciro Santilli OurBigBook.com
    @VonC 当然是开玩笑了,我也会点赞你的东西的。我只是需要找到一种把这些积分兑换成钱的方法现在XD。 - Ciro Santilli OurBigBook.com
    这需要很长时间。它逐个获取d1中的每个文件。 - The Fool
    @TheFool 我在我的测试仓库中得到了类似的时间,如果你有一个精确的测试仓库和命令,请告诉我。 - Ciro Santilli OurBigBook.com
    我尝试获取此存储库的一个文件夹,每个文件夹包含1000多个文件。https://github.com/yannh/kubernetes-json-schema/tree/master/master-standalone-strict。当我简单地克隆整个存储库时,比使用此处描述的方法获取一个文件夹要快得多。 - The Fool
    1
    @TheFool 好的,我已经复现了,谢谢。这个答案包含了一个过时的命令 git checkout,我的主要答案在:https://dev59.com/QHRB5IYBdhLWcg3wgXhV#52269934 中有正确的命令 git sparse-checkout set。使用这个命令可以瞬间完成更新。已经更新。 - Ciro Santilli OurBigBook.com

    31

    如果想要在特定文件夹工作,您需要克隆该特定文件夹本身,为此,请按照以下步骤使用稀疏检出。

    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


    很遗憾,这条评论没有得到足够的赞。看起来提供的解决方案适用于所有的git仓库,而不仅仅是github。 - Kalyan
    11
    然而,这并没有实现预期的目标。它仍然会克隆整个存储库,只是不检出某些文件夹。 - Chris - Regenerate Response
    已解决:https://dev59.com/TW855IYBdhLWcg3w1oLa可以不用检出整个仓库进行稀疏检出吗? - J K
    我收到了这个错误:稀疏检出在工作目录中没有留下任何条目。 - orangecaterpillar

    25
    与Subversion不同,Git无法单独检出每个子目录,它是以整个仓库作为操作对象的。如果需要更精细的访问权限,可以使用子模块--每个子模块都是一个单独的Git项目,因此可以单独克隆。尽管它们允许您下载单个文件,但在我所知道的情况下,Git前端(例如GitHub的Web界面或gitweb)可能会选择提供一个接口来提取给定的文件夹,但并没有这样做。编辑-GitHub实际上通过SVN提供访问权限,这将允许您执行此操作(如评论所述)。请参见https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away了解最新的说明。

    有没有通过GitHub API获取任何东西的方法? - g_inherit

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,