从GitHub repo DownGit下载单个文件夹或目录

问题描述 投票:864回答:28

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

举个例子说GitHub repo住在这里:

[email protected]:foobar/Test.git

其目录结构:

Test/
    foo/ 
       a.py
       b.py
    bar/
       c.py
       d.py

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

git file github directory repository
28个回答
822
投票

2016年9月更新:社区创建了一些可以为您执行此操作的工具:


Git不支持这个,但Github通过SVN做。如果你用subversion核实你的代码,Github基本上会在后端将repo从git转换为subversion,然后提供请求的目录。

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

  1. 获取repo URL。首先,将Github仓库的URL复制到剪贴板。 github repo URL example
  2. 修改subversion的URL。我想从/docs分支下载master的文件夹,所以我将追加trunk/docs。完整的URL现在是https://github.com/lodash/lodash/trunk/docs。请参阅下面的注释,以更深入地解释为什么我们必须使用此URL格式。
  3. 下载文件夹。转到命令行并使用SVN获取文件夹。 svn checkout https://github.com/lodash/lodash/trunk/docs

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

完整的URL格式说明:

  • 如果您对master分支感兴趣,请改用trunk。所以完整的路径是trunk/foldername
  • 如果您对foo分支感兴趣,请改用branches/foo。完整的路径看起来像branches/foo/foldername
  • Protip:如果您愿意,可以在下载之前使用svn ls查看可用的标签和分支

就这样! Github supports more subversion features也包括对提交和推动变更的支持。


13
投票

如果你真的只是想“下载”文件夹而不是“克隆”它(用于开发),那么最简单的方法就是获取最新版本的存储库(以及其中的文件夹/文件)的副本,无需克隆整个存储库甚至首先安装git,就是通过在GitHub上访问所需的存储库/ fork / branch / commit来下载zip存档(对于任何存储库,分支,分支,提交等) (例如,http(s)://github.com/<user>/<repo>/commit/<Sha1>获取特定提交后的文件副本)并选择右上角附近的Downloads按钮。

这种存档格式不包含任何git-repo魔法,只包含跟踪文件本身(如果跟踪它们可能还有一些.gitignore文件,但你可以忽略它们:p) - 这意味着如果代码发生了变化,你想要保持最佳状态,您必须手动重新下载它,这也意味着您将无法将其用作git存储库...

不确定在这种情况下你是否正在寻找(再次,“下载”/查看vs“克隆”/开发),但它仍然有用......


13
投票

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


9
投票

另一个具体例子:

就像我想从网址下载'iOS Pro Geo'文件夹

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

我可以通过这样做

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

注意路径中的主干

编辑:(根据Tommie C的评论)

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

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

编辑:如果树/主人不在网址,然后叉它,它将在分叉网址。


6
投票

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

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

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

6
投票

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

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

项目页面是here

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


5
投票

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

git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -

但是如果你想要检查它,并且能够做出提交并将它们推回去,那么你不能这样做。


5
投票

如果您对unix命令感到满意,则不需要特殊的依赖关系或Web应用程序。您可以将repo下载为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文件或特定分支/ refs)
  • 保持路径的起始部分(*/)以匹配任何目录。 Github使用名称中的commit ref创建一个包装器目录,因此无法知道。
  • 您可能希望--strip-components与路径(前一个参数)中的斜杠(/)的数量相同。

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


4
投票

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

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


4
投票

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

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

}

然后刷新shell

source ~/.bashrc 

然后使用它与git-downloadfolder blablabla:D


3
投票

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

461
投票

此功能有两个选项:

Option 1: Browser Extensions

Chrome ExtensionFirefox Addon

用法:

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

获取令牌:

  1. 单击浏览器上的GitZip Extension图标。
  2. 点击“Get Token”旁边的“Normal”或“Private”链接。
  3. 在Github auth页面上授权GitZip权限。
  4. 回到开头的回购页面。
  5. 继续使用。

Option 2: Github gh-page

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

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

在大多数情况下,它工作正常,但该文件夹包含超过1,000个文件,因为Github Trees API限制。 (指Github API#Contents

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


3
投票

我使用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访问权限(像我一样),您可以使用以下内容在.pydistutils.py目录中创建一个$HOME文件: [install] user=1 easy_install lxml将起作用(参考:https://stackoverflow.com/a/33464597/591257)。


3
投票

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

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

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


2
投票

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

1
投票

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

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


1
投票

一个直截了当的答案是首先从下面的链接中加入svn。

https://tortoisesvn.net/downloads.html

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

复制github子目录链接。

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

用trunk替换tree / master

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

并做

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

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


1
投票

来自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

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

我在以下网站更详细地介绍了这一点:How do I clone a subdirectory only of a Git repository?


0
投票

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

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

0
投票

如果您想使用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/


-2
投票

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

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


419
投票

Go to DownGit > Enter Your URL > Download!

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


DownGit


您还可以配置下载文件的属性-detailed usage


152
投票

如果你有svn,你可以使用svn export来做到这一点:

svn export https://github.com/foobar/Test.git/trunk/foo

请注意URL格式:

  • 基本网址是https://github.com/
  • /trunk附加在最后

在运行svn export之前,最好首先验证目录的内容:

svn ls https://github.com/foobar/Test.git/trunk/foo

63
投票

For a Generic git Repo:

如果要下载文件,而不是使用历史记录克隆存储库,可以使用git-archive执行此操作。

git-archive制作git存储库的压缩zip或tar存档。一些让它变得特别的东西:

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

从您使用ssh连接的远程仓库创建docs/usage目录的存档的示例:

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tgz

有关this blog postgit documentation的更多信息。

Note on GitHub Repos:

GitHub doesn't allow git-archive access。 ☹️


34
投票

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


31
投票

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

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

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

〜如果你想签出文件夹而不是简单地下载它,请尝试使用svn help(tldr:用导出替换导出)

更新

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


23
投票

谁正在处理特定文件夹,他需要克隆该特定文件夹本身,为此请通过使用稀疏结帐执行以下步骤。

  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

16
投票

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

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

可以想象Git前端(例如GitHub的web界面,或gitweb)可以选择为您提供一个接口来提取给定的文件夹,但据我所知,他们都没有这样做(虽然他们确实让你下载单个文件,所以如果文件夹不包含太多文件,那么这是一个选项)

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

© www.soinside.com 2019 - 2024. All rights reserved.