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

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

假设GitHub repo的例子住在这里:

git@github.com:foobar/Test.git

其目录结构:

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

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

1339911 次浏览

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

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

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

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

您可以简单地下载目录树:

git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -

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

如果你真的只想下载文件文件夹而不是“克隆”它(用于开发),最简单的方法就是简单地获得最新版本的存储库的复制(因此其中的文件夹/文件),而不需要克隆整个存储库,甚至首先安装git,就是下载一个zip存档(对于任何存储库、分叉、分支、提交等),方法是转到GitHub上所需的存储库/分叉/分支/提交(例如,在特定提交之后的文件副本为http(s)://github.com/<user>/<repo>/commit/<Sha1>)并选择右上角附近的Downloads按钮。

这种归档格式不包含git-repo的魔力,只有被跟踪的文件本身(如果它们被跟踪,也许还有一些. gitignore文件,但你可以忽略这些:p)-这意味着如果代码发生变化并且你想保持领先地位,你必须手动重新下载它,这也意味着你将无法将其用作git存储库。

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

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

最后,我们倾向于三种选择:

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

如果你想下载的是一个单独的库,最好创建一个其他的git repo,然后使用git子模块函数。

当然,您必须是您想要的初始回购的所有者

对于通用git Repo:

如果您想下载文件,而不是使用历史记录克隆存储库,您可以使用#0执行此操作。

#0为git存储库制作了一个压缩的zip或tar存档。一些使它特别的事情:

  1. 您可以选择要归档的git存储库中的文件或目录。
  2. 它不归档.git/文件夹,也不归档运行它的存储库中的任何未跟踪文件。
  3. 您可以存档特定的分支、标签或提交。使用git管理的项目通常使用它来生成项目版本(beta、版本、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 Repos的说明:

GitHub不允许#0访问.☹️

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

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


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

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

  1. 导航到您要下载的文件夹。让我们从master分支下载/testgithub仓库URL示例

  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支持更多颠覆功能也是如此,包括对提交和推送更改的支持。

如果你有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

如果您需要以编程方式执行此操作并且不想依赖SVN,您可以使用GitHub API递归下载所有内容。

为了灵感,这是我的红宝石要点:https://gist.github.com/cvengros/b2a7e82f66519d423b6f

只是为了放大上面的答案,从真正的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

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

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

  1. 创建一个目录。

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

  3. 启用稀疏签出。(git config core.sparsecheckout true

  4. 告诉Git你想要哪个目录(回显2015/品牌/五月(指你要处理的文件夹)>>.git/info/sparse-checkout

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

  6. 获取文件(git pull origin master

另一个具体例子:

就像我想从URL下载iOSPro Geo文件夹一样

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

我可以通过

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

编辑:如果tree/master不在url中,那么分叉它,它将在分叉的url中。

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

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

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

  1. 在Mac上,您可能已经拥有SVN(仅测试打开的终端和键入"svn""哪个svn"~不带引号)
  2. 在Github上:通过单击存储库中的特定文件夹名称来找到您的git文件夹(而不是存储库)的Github路径
  3. 从浏览器的地址栏复制路径
  4. 开放终端和类型:svn导出
  5. 接下来粘贴地址(例如):https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. 替换单词:主树
  7. 上一篇:主干
  8. 输入文件的目标文件夹(在本例中,I将目标文件夹存储在下载文件夹中当前用户)
  9. 空格只是空格键而不是单词(空间)~/下载/HeadsUpUI
  10. 最终终端命令显示下载文件夹(将地址与步骤5进行比较)svn导出https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI~/下载/抬头界面

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

~如果您想签出文件夹而不是简单地下载它,请尝试使用svn帮助(tldr:将出口替换为结帐

更新

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

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

例如,要从以下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

此功能有两个选项:

选项1:GitZip浏览器扩展

Chrome扩展边缘扩展Firefox插件

用法:

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

获取代币:

  1. 单击浏览器上的GitZip扩展图标。
  2. 点击“获取令牌”之外的“普通”或“私人”链接。
  3. 在Github auth页面上授权GitZip权限。
  4. 回到回购页的开头。
  5. 继续使用。

选项2:Github gh-page

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

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

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

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

我们的团队编写了一个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

转到下G吧>输入您的URL>下载!

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


DownGit


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


免责声明:我也是和提问者一样陷入了同样的问题中,找不到任何简单的解决方法,所以我先开发了这个工具自用,再开放给大家使用:)

我使用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库,可以安装easy_install lxml
如果您没有root访问权限(像我一样),您可以在$HOME目录中创建一个.pydistutils.py文件,其中包含以下内容:[安装]user=1easy_install lxml就可以了(参考:https://stackoverflow.com/a/33464597/591257)。

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

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

然后刷新shell

source ~/.bashrc

然后将其与git下载文件夹blablabla: D一起使用

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

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

项目页面为这里

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

在我的情况下,这些答案都没有帮助。如果你是为Windows开发的,你可能没有svn。在许多情况下,你不能指望用户安装Git,或者出于其他原因不想下载整个存储库。回答这个问题的一些人,比如Willem van Ketwich和aztack,制作了完成这项任务的工具。但是,如果该工具不是为您使用的语言编写的,或者您不想安装第三方库,这些都不起作用。

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

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

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

例子(woff2文件从一个子目录font的真棒):

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创建了一个包装器目录,名称中包含提交ref,因此无法知道。
  • 您可能希望--strip-components与路径中的斜杠数量(/)相同(上一个参数)。

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

使用此函数,第一个参数是文件夹的url,第二个是文件夹将下载到的位置:

function github-dir() {svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"}

如果您想使用Python和SVN下载特定的GitHub目录,以下是您将使用的代码:

import validatorsfrom svn.remote import RemoteClient
def download_folder(url):if 'tree/master' in url:url = url.replace('tree/master', 'trunk')
r = RemoteClient(url)r.export('output')

if __name__ == '__main__':url = input('Enter folder URL: ')if not validators.url(url):print('Invalid url')else:download_folder(url)

您可以在本教程中查看有关此代码和其他GitHub搜索和下载提示的更多详细信息:https://python.gotrained.com/search-github-api/

一个直接的答案,这是第一个乌龟svn从以下链接。

https://tortoisesvn.net/downloads.html

安装时打开CLI选项,以便可以从命令行界面使用它。

复制git hub子目录链接。

示例

https://github.com/tensorflow/models/tree/master/research/deeplab

用树干替换树/主树

https://github.com/tensorflow/models/trunk/research/deeplab

并做

svn检查https://github.com/tensorflow/models/trunk/research/deeplab

文件将下载到当前目录中的Deepplab文件夹。

git clone --filter from git 2.19现在可以在GitHub上使用

测试2020-09-18,git 2.25.1。

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

例如,仅克隆此存储库d1所需的对象:https://github.com/cirosantilli/test-git-partial-clone我可以这样做:

git clone \--depth 1 \--filter=blob:none \--no-checkout \https://github.com/cirosantilli/test-git-partial-clone \;cd test-git-partial-clonegit checkout master -- d1

我已经详细介绍了这一点:Git:如何仅克隆Git存储库的子目录?

2019总结

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

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

此外,我还为那些需要从GitHub下载单个文件(而不是文件夹)的人发布了关于StackOverflow的问题


1. GitHub用户界面

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

2.第三方工具

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

3. Subversion

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

4. GitHub API

  • 如果您想以编程方式完成此任务,这就是您需要的解决方案。这实际上是DownGit在幕后使用的。使用GitHub的REST API,编写一个脚本,对内容端点执行GET请求。端点的构造如下:https://api.github.com/repos/:owner/:repo/contents/:path。替换占位符后,一个示例端点是:https://api.github.com/repos/babel/babel-eslint/contents/lib。这为您提供了该文件夹中存在的所有内容的JSON数据。数据包含您需要的一切,包括内容是否是文件夹或文件,如果是文件,则为下载URL,如果是文件夹,则为API端点(以便您可以获取该文件夹的数据)。使用这些数据,脚本可以递归地遍历目标文件夹中的所有内容,为嵌套文件夹创建文件夹,并下载每个文件夹的所有文件。查看DownGit的代码以获得灵感。

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

首先,将tree/master替换为trunk然后,通过sudo apt install git-svn安装git-svn

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

通过这种方式,您不必经历设置svn的痛苦,特别是对于Windows用户。

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

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

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

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

只有5步要走

  • 这里下载SVN
  • 打开CMD并转到SVN bin目录cd %ProgramFiles%\SlikSvn\bin
  • 假设我想下载这个目录URL
    https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples
  • 替换tree/develop或者tree/mastertrunk
  • 现在触发最后一个命令以下载同一目录中的文件夹。
svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples

在您要加载的目录中:

git initgit remote add origin -f repoUrl // folder urltouch .git/info/sparse-checkoutgit pull origin master

只有4行代码

git sparse-checkout

git 2.25.0包括一个新的实验git sparse-checkout命令,使现有功能更易于使用,以及大型存储库的一些重要性能优势。(The github博客

当前版本为例:

git clone --filter=blob:none --sparse https://github.com/git/git.gitcd gitgit sparse-checkout init --conegit sparse-checkout add t

最值得注意的是

  • #0仅将git存储库的顶级目录文件签出到工作副本中
  • git sparse-checkout add t增量添加/签出gitt子文件夹

其他要素

  • #0做了一些准备以启用部分签出
  • --filter=blob:none通过仅下载必要的git对象来优化数据获取(查看部分克隆特征以获取更多信息)
  • #0还通过应用更受限制的文件包含模式来加快性能

github状态

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

最简单的方法是使用获取器

首先,使用以下命令安装ftcher:

npm install-g github-files-ftcher下载工具下载工具

然后您可以下载带有其URL的文件或文件夹:

获取器--url=resource_url--out=output_directory

例如:

获取者--url="https://github.com/Gyumeijie/github-files-fetcher/blob/master/CHANGELOG.md";--out=/tmp

您可以尝试使用chrome的gitzip扩展,它非常易于使用,并且以前也帮助我下载了许多文件夹!

通过在url中将github替换为githubbox并在codesandbox上打开repo到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。

试试看。

https://github.com/twfb/git-directory-download

usage: gitd [-h] [-u URL] [-r] [-p] [--proxy PROXY]
optional arguments:-h, --help         show this help message and exit-u URL, --url URL  github url, split by ",", example: "https://x, http://y"-r, --raw          download from raw url-p, --parse        download by parsing html--proxy PROXY      proxy config, example "socks5://127.0.0.1:7891"
Example:1. download by raw url: gitd -u "https://github.com/twfb/git-directory-download"2. download by raw url: gitd -r -u "https://github.com/twfb/git-directory-download"3. dowmload by parsing: gitd -p -u "https://github.com/twfb/git-directory-download"4. download by raw url with proxy: gitd -r -u "https://github.com/twfb/git-directory-download" --proxy "socks5://127.0.0.1:7891"

这是我用git v2.25.0做的,也用v2.26.2测试过。这个技巧不适用于v2.30.1

TLDR

git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencvcd opencv
# requires git 2.25.x to 2.26.2git sparse-checkout set data/haarcascades

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

git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencvcd opencv
# requires git 2.25.x to 2.26.2docker 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 opencv7.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.xmlhaarcascade_eye_tree_eyeglasses.xml      haarcascade_frontalface_alt_tree.xml  haarcascade_lowerbody.xml                   haarcascade_upperbody.xmlhaarcascade_frontalcatface.xml           haarcascade_frontalface_default.xml   haarcascade_profileface.xmlhaarcascade_frontalcatface_extended.xml  haarcascade_fullbody.xml              haarcascade_righteye_2splits.xmlhaarcascade_frontalface_alt.xml          haarcascade_lefteye_2splits.xml       haarcascade_russian_plate_number.xml

参考文献

要做到独一无二,我必须说你也可以下载没有svn、git或任何apigithub文件夹。Github支持RAW链接,您可以利用它仅下载您需要的文件和文件夹。

我注意到很多事情。下面是我的研究收藏:

机制

  • 从网页中抓取所有超链接<a>并获取其href="value"

  • 如果href值包含“/tree/master/”或“/tree/main/”,则它是文件夹链接:https://github.com/graysuit/GithubFolderDownloader /tree/main/ GithubFolderDownloader

  • 否则,如果href值包含“/blob/master/”或“/blob/main/”,则它是文件链接:https://github.com/graysuit/GithubFolderDownloader /blob/main/ GithubFolderDownloader.sln

  • 之后,将“github.com”替换为“raw.githubusercontent.com”并从文件中删除“/blob/”:https://raw.githubusercontent.com/graysuit/GithubFolderDownloader/main/GithubFolderDownloader.sln

  • 它将成为RAW链接。现在您可以下载它。

工具

在上述研究的基础上,我用C#创建了一个可以抓取文件夹的极简工具。灰色西装/G it hub文件夹向下加载器

备注:我是作者。如果有任何遗漏或不清楚的地方,您可以发表评论。

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

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

它是一个独立的便携式外壳脚本,不使用SVN(在大型存储库上对我不起作用)。它也不使用API,因此不需要令牌,也不受速率限制。

声明:我做到了。

如果您想从存储库中获取某个文件,则此答案适用于特殊情况。

可以找到一个简短的答案这里。您应该将URL更改为以下格式:

https://raw.github.com/user/repository/branch/file.name

简单地解释一下,请从github输入您想要的url。将raw。在url地址中的github之前,然后从地址中删除blob。例如,假设您想在此地址中获取csv文件:

https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv

您应该将url更改为此:

https://raw.github.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv

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

GitHub的基于vscode的编辑器。

优点:

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

说明

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

说明

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

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

其他选择

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

我创建了一个支持下载目录、文件和存储库(私有/公共)的简单应用程序。

应用程序:https://downdir.vercel.app/

Github:https://github.com/renomureza/downdir

将git存储库文件夹下载到当前目录并删除git文件。

#!/bin/sh
function download_git_folder() {repo_url=$1branch=$2repo_subfolder_path=$3  
repo_folder=$(basename $repo_url)git initgit remote add -f origin ${repo_url}git config core.sparseCheckout trueecho "${repo_subfolder_path}" >> .git/info/sparse-checkoutgit pull origin ${branch}mv "${repo_subfolder_path}"/* ./
readarray -td/ root_subfolder <<<"${repo_subfolder_path}"; declare -p root_subfolder;rm -rf ./.git ${root_subfolder[0]}}

用法

download_git_folder "git@github.com:foobar/Test.git" "master" "Test/bar"

我找到的最简单的方法是如何仅克隆Git存储库的子目录?

我在git clone命令中添加了-b <branch> --single-branch来下载特定的分支。所以我使用的命令是:

git clone --depth 1 --single-branch -b <branch> --filter=blob:none --sparse <url>git sparse-checkout set <directory>