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

举个GitHub repo的例子:

git@github.com:foobar/Test.git

其目录结构:

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

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


当前回答

gitclone--筛选器仅下载所需文件

例如,要仅克隆此存储库的子目录big/所需的对象:https://github.com/cirosantilli/test-git-partial-clone-big-small我可以做到:

git clone --depth 1 --filter=blob:none --sparse \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git sparse-checkout set small

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

我在下面的文章中详细介绍了这一点:如何仅克隆Git存储库的子目录?

2021 1月在git 2.30.0上测试。

其他回答

另一个具体示例:

就像我想从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的评论)

是的,使用导出而不是签出将提供一个干净的副本,而无需额外的git存储库文件。

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

已编辑:如果树/主节点不在url中,则分叉它,它将在分叉的url中。

2021 4月更新:社区创建的一些工具可以为您做到这一点:

下载目录(Credits to fregante)它还作为Github web UI中的一个按钮集成到了出色的精致Github chrome扩展中。GitZip(归功于Kino-请在此处查看他的答案)DownGit(归功于Minhas Kamal-见此处的答案)

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


原始(手动)方法:git本机不支持检出单个目录,但Github可以通过SVN实现这一点。如果您使用subversion签出代码,Github将在后端将repo从git转换为subversion,然后提供所请求的目录。

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

导航到要下载的文件夹。让我们从master分支下载/测试。修改subversion的URL。用树干替换树/主树。https://github.com/lodash/lodash/tree/master/test ➜https://github.com/lodash/lodash/trunk/test下载文件夹。转到命令行,用SVN抓取文件夹。

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

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

完整的URL格式说明:如果您对master分支感兴趣,请改用trunk。所以完整路径是trunk/foldername如果您对foo分支感兴趣,请改用branches/foo。这个完整路径看起来像branches/foo/foldernameProtip:如果您愿意,可以在下载之前使用svnls查看可用的标记和分支

这就是全部!Github还支持更多的subversion特性,包括提交和推送更改的支持。

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

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

这是一个独立的可移植shell脚本,不使用SVN(这对我来说在大型回购中不起作用)。它也不使用API,因此不需要令牌,也不受速率限制。

免责声明:我做到了。

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

GitHub基于vscode的编辑器。

赞成的意见:

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

说明书

转到任何回购。(例如。https://github.com/RespiraWorks/Ventilator/tree/master/software)按或者在URL中将.com替换为.dev,以在GitHub的内部编辑器中打开repo在资源管理器窗格(左侧或按Ctrl+Shift+E)中,右键单击所需的文件/文件夹并选择下载。在“选择文件夹”对话框中,选择磁盘上希望所选文件/文件夹存在的目录。

Note

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

不要只为此安装和学习svn。其他工具,如Download Directory、Refined GitHub、GitZip和DownGit,要么需要API令牌,要么无法下载大型目录。

其他选项

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

此功能有两个选项:

选项1:GitZip浏览器扩展

Chrome扩展、Edge扩展、Firefox插件

用法:

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

获取令牌:

单击浏览器上的GitZip Extension图标。单击“获取令牌”之外的“普通”或“专用”链接。在Github身份验证页面上授权GitZip权限。返回到开始的回购页面。继续使用。


选项2:Github gh页面

http://kinolien.github.io/gitzip通过使用GitHub API和JSZip、FileSaver.js库。

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

在大多数情况下,它工作正常,除了文件夹包含1000多个文件,因为Github Trees API的限制。(参考Github API#内容)

此外,如果您拥有GitHub帐户并在该站点中使用“获取令牌”链接,它还可以支持私有/公共回购并升级费率限制。