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

痴心易碎 提交于 2020-01-23 02:35:47

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

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

git@github.com:foobar/Test.git

其目录结构:

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

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


#1楼

这是SVN比Git更好的少数几个地方之一。

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

  1. 使用wget从GitHub抓取数据(使用原始文件视图)。
  2. 让上游项目将所需的数据子集发布为构建工件。
  3. 放弃并使用完整的结帐。 在第一个版本中这是一个很大的成功,但是除非您获得大量流量,否则在后续版本中不会有太多麻烦。

#2楼

如果要下载的目录是一个单独的库,最好创建另一个git repo,然后再使用git子模块功能。

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


#3楼

对于通用git Repo:

如果要下载文件,而不是使用历史记录克隆存储库,则可以使用git-archive

git-archive创建git存储库的压缩zip或tar存档。 一些使它特别的东西:

  1. 您可以选择git存储库中要归档的文件或目录。
  2. 它不会在运行它的存储库中存档.git/文件夹或任何未跟踪的文件。
  3. 您可以存档特定的分支,标记或提交。 使用git管理的项目经常使用它来生成项目版本的存档(测试版,发行版,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不允许git-archive访问 。 ☹️


#4楼

2016年9月更新:社区创建了一些工具可以为您做到这一点:


Git不支持此功能,但是Github通过SVN支持。 如果您使用subversion签出代码,Github实际上将在后端将仓库从git转换为subversion,然后提供所请求的目录。

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

  1. 导航到要下载的文件夹 。 让我们从master分支下载/test

  2. 修改用于Subversion的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还支持更多的Subversion功能 ,包括对提交和推送更改的支持。


#5楼

如果您具有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

#6楼

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

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


#7楼

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

有时,一个具体的例子有助于阐明提议的替代方案。


#8楼

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

  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


#9楼

另一个具体示例:

就像我想从网址下载“ 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中,则将其分叉,它将在分叉URL中。


#10楼

我创建了一个名为GitHubFolderDownloader的开源项目。 它使您可以下载存储库的单个文件夹,而无需克隆或下载整个存储库。


#11楼

其他答案没什么问题,但我只是想与那些第一次在此过程中徘徊的人分享逐步说明。

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

〜要打开终端,只需单击聚光灯并键入终端,然后按Enter

  1. 在Mac上,您可能已经拥有SVN(要测试打开的终端,然后键入“ svn”“哪个svn” 〜而不带引号)
  2. 在Github上:通过单击存储库中的特定文件夹名称,找到git文件夹(而非存储库)的Github路径
  3. 从浏览器的地址栏中复制路径
  4. 打开终端并输入: svn export
  5. 接下来粘贴地址(例如): https : //github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. 替换单词: tree / master
  7. 词: 树干
  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帮助(tldr:将输出替换为checkout

更新资料

关于恢复中断的下载/签出的评论。 我会尝试运行svn cleanup然后执行svn update 。 请在SO中搜索其他选项。


#12楼

要从GitHub导出目录,请将目录网址中的“ / 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

#13楼

此功能有两个选项:

选项1:浏览器扩展

Chrome扩展程序Firefox插件

用法:

  1. 在任何GitHub存储库页面中。
  2. 只需双击所需项目的空白部分。
  3. 点击右下角的下载按钮。
  4. 查看进度仪表板,然后等待浏览器触发器下载。
  5. 获取ZIP文件。

获取令牌:

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

选项2:Github gh页

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

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

在大多数情况下,它都可以正常工作,但由于Github Trees API的限制,该文件夹包含1,000个以上的文件。 (参考Github API#Contents

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


#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

#15楼

1.单击此链接http://kinolien.github.io/gitzip/
2.粘贴您要下载的Github文件夹的链接。
3.单击搜索,将显示所有文件供下载。
注意:-使用搜索,无需输入令牌密钥;)..保持简单!


#16楼

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

现在,您可以从DownGit 直接为任何GitHub公共目录或文件( 特别是大文件直接下载或创建下载链接 ! 这是一个简单的演示-



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


#17楼

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

用法很简单,只需从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文件,其中包含以下内容: [install] user=1并且easy_install lxml可以正常使用(参考: https:// stackoverflow .com / a / 33464597/591257 )。


#18楼

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

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

}

然后用刷新外壳

source ~/.bashrc 

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


#19楼

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

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

项目页面在这里

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


#20楼

在我的情况下,所有答案均无济于事。 如果您正在为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请求,但这可以在几乎任何语言,任何平台上实现。 它可以用来获取文件或目录。


#21楼

如果您对Unix命令感到满意,则不需要特殊的依赖项或Web应用程序。 您可以将压缩包下载为tarball,仅解压缩所需的文件。

示例(来自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与路径中的斜杠( / )相同(上一个参数)。

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


#22楼

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

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

#23楼

如果要使用Python和SVN下载特定的GitHub目录,请使用以下代码:

import validators
from 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/


#24楼

一个简单的答案是先从下面的链接开始乌龟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

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


#25楼

来自Git 2.19的git clone --filter

此选项实际上将跳过从服务器获取不需要的对象的操作:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/

服务器应配置为:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

v2.19.0中对Git远程协议进行了扩展以支持此功能,但当时不支持服务器。 但是它已经可以在本地测试。

我已经在以下文章中进行了详细介绍: 如何仅克隆Git存储库的子目录?


#26楼

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

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

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

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


#27楼

您可以简单下载目录树:

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

但是,如果您打算将其签出,并且能够进行提交并将其推回原位,那么您就不能这样做。


#28楼

如果您确实只想“下载”该文件夹而不是“克隆 该文件夹(以进行开发),那么最简单的方法就是简单地获取该存储库的最新版本(以及其中的一个文件夹/文件)的副本 ,无需克隆整个存储库甚至无需首先安装git,只需在GitHub上所需的存储库/ fork / branch / commit上下载zip归档文件(用于任何存储库,fork,branch,commit等)。 (例如,使用http(s)://github.com/<user>/<repo>/commit/<Sha1>复制特定提交后的文件副本),然后选择右上角附近的“ Downloads按钮。

这种存档格式不包含任何git-repo魔术,仅包含被跟踪的文件本身(如果被跟踪,则可能包含几个.gitignore文件,但是您可以忽略那些:p)-这意味着如果代码更改并且您想要保持在最前面,您必须手动重新下载它,这也意味着您将无法将其用作git存储库...

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!