如何从GitHub上托管的远程Git repo中仅下载特定文件夹或目录?
举个GitHub repo的例子:
git@github.com:foobar/Test.git
其目录结构:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
我只想下载foo文件夹,而不是克隆整个测试项目。
如何从GitHub上托管的远程Git repo中仅下载特定文件夹或目录?
举个GitHub repo的例子:
git@github.com:foobar/Test.git
其目录结构:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
我只想下载foo文件夹,而不是克隆整个测试项目。
当前回答
这是我用git v2.25.0做的,也是用v2.26.2测试的。这个技巧不适用于v2.30.1
TLDR
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
工具书类
git稀疏签出日志git稀疏签出文档gitfilter props文档
其他回答
为了放大上面的答案,一个从真正的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
有时,一个具体的例子有助于澄清所提出的替代方案。
一个简单的答案是从下面的链接中选择第一个乌龟svn。
https://tortoisesvn.net/downloads.html
安装时打开CLI选项,以便可以从命令行界面使用它。
复制github子目录链接。
实例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
文件将被下载到当前目录中的deeplab文件夹中。
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特性,包括提交和推送更改的支持。
只需5步
从这里下载SVN。打开CMD并转到SVN bin目录,如:cd%ProgramFiles%\SlikSvn\bin假设我想下载这个目录URLhttps://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples代替树/开发或树干的树/主现在启动最后一个命令以下载同一目录中的文件夹。
svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples
2019年总结
有多种方法来处理这一点,这取决于您是否希望手动或以编程方式执行此操作。
下面总结了四个选项。对于那些喜欢更实际的解释的人,我制作了一个YouTube视频:从GitHub下载个人文件和文件夹。
此外,对于那些需要从GitHub下载单个文件(而不是文件夹)的人,我在StackOverflow上发布了类似的答案。
1.GitHub用户界面
存储库主页上有一个下载按钮。当然,这将下载整个repo,之后您需要解压缩下载,然后手动拖出所需的特定文件夹。
2.第三方工具
有多种浏览器扩展和web应用可以处理这一问题,DownGit就是其中之一。只需将GitHub URL粘贴到文件夹(例如。https://github.com/babel/babel-eslint/tree/master/lib)然后按下“下载”按钮。
3.子版本
GitHub不支持git存档(允许我们下载特定文件夹的git功能)。然而,GitHub支持多种Subversion功能,我们可以使用其中一种功能。Subversion是一种版本控制系统(git的替代品)。您需要安装Subversion。获取要下载的文件夹的GitHub URL。不过,您需要修改此URL。您需要指向存储库的链接,后跟单词“trunk”,并以指向嵌套文件夹的路径结尾。换句话说,使用与我前面提到的相同的文件夹链接示例,我们将用“trunk”替换“tree/master”。最后,打开一个终端,导航到要下载内容的目录,输入以下命令(用您构建的URL替换URL):svn exporthttps://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的代码以获得灵感。