首页 文章

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

提问于
浏览
756

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

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

git@github.com:foobar/Test.git

其目录结构:

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

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

26 回答

  • 3

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

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

    无论谁正在处理特定文件夹,他需要克隆该特定文件夹本身,所以请按照以下步骤** ---使用SPARSE CHECKOUT --- **

    第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

  • 1

    要从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
    
  • 2

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

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

  • 713

    我使用的是没有root访问权限的CentOS 7服务器,也没有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 文件: [install] user=1easy_install lxml 将正常工作(ref:https://stackoverflow.com/a/33464597/591257) .

  • -1

    在我的情况下,没有一个答案有帮助 . 如果您正在为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请求,但这可以在任何平台上以几乎任何语言实现 . 它可用于获取文件或目录 .

  • 4

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

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

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

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

  • 11

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


    Git不支持此功能,但Github通过SVN支持 . 如果你用subversion签出你的代码,Github将在后端基本上将repo从git转换为subversion,然后提供所请求的目录 .

    这里's how you can use this feature to download a specific folder. I' ll使用流行的javascript库 lodash 作为示例 .

    • Get the repo URL . 首先,将Github仓库的URL复制到剪贴板 .
      github repo URL example

    • Modify the URL for subversion . 我想从 master 分支下载 /docs 的文件夹,所以我将追加 trunk/docs . 完整网址现在是 https://github.com/lodash/lodash/trunk/docs . 请参阅下面的注释,以更深入地解释我们必须使用此URL格式的原因 .

    • Download the folder . 转到命令行并使用SVN获取文件夹 . svn checkout https://github.com/lodash/lodash/trunk/docs

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

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

    就这样! Github supports more subversion features也包括对提交和推送更改的支持 .

  • 395

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

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

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

    • 在Mac上,您可能已经拥有SVN(仅测试打开的终端并键入 "svn""which svn" ~不带引号)

    • 在Github上:通过单击仓库中的特定文件夹名称,找到git文件夹(而不是仓库)的Github路径

    • 从浏览器的地址栏复制路径

    • Open Terminal 并输入: svn export

    • 下一次粘贴地址(例如): https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI

    • 替换字: tree/master

    • ,单词: trunk

    • 键入文件的目标文件夹(在本例中,我将目标文件夹存储在当前用户的Downloads文件夹中)

    • 这里的空格只是空格键而不是 (space) ~/Downloads/HeadsUpUI

    • final terminal命令显示下载文件夹的完整命令(将地址与步骤5进行比较) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~/Downloads/HeadsUpUI

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

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

    Update

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

  • 1

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

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

    然后刷新shell

    source ~/.bashrc
    

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

  • 11

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

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

    项目页面是here

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

  • 34

    如果你真的只想 "download" 文件夹而不是 "clone" 它(用于开发),最简单的方法就是获得最新版本的存储库(因此其中包含文件夹/文件)的副本,而无需克隆整个repo甚至首先安装git,是通过转到GitHub上所需的repository / fork / branch / commit来下载一个zip存档(对于任何repo,fork,branch,commit等)(例如 http(s)://github.com/<user>/<repo>/commit/<Sha1> for在特定提交之后的文件副本)并选择右上角附近的 Downloads 按钮 .

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

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

  • 1

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

    现在,您可以 DIRECTLY DOWNLOAD 或从DownGit为任何GitHub公共目录或文件(特别是大文件)创建 DOWNLOAD LINK !这是一个简单的示范 -


    DownGit


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

  • 7

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

  • 335

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

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

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

  • 15

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

    对于Generic git Repo:

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

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

    • You can choose which files or directories in the git repository to archive.

    • 它不归档 .git/ 文件夹,也不归档运行的存储库中任何未跟踪的文件 .

    • 您可以归档特定分支,标记或提交 . 使用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中的更多信息 .

    关于GitHub Repos的注意事项:

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

  • 4

    我写了一个工具Node.js就是为了这个 . 看看Download Repo Dir

    使用 npm i -g dl-repo-dir 安装,命令 repo 将全局可用 .

    下载并重命名存储库中的目录

    repo download aztack/download-repo-dir lib src/lib/new-name

    下载存储库

    repo download aztack/download-repo-dir '' src/lib/download-repo-dir

    从具有给定标记的私有gitlab存储库下载

    export GITLAB_API_PRIVATE_TOKEN=YOUR_TOKEN_HERE

    repo download gitlab:mygitlab.com:topgroup/subgroup/repo#v1.0.0 dir src/lib/new-name

    并且将有一个 repo.json 文件来保存所有信息 .

    在新项目中,您可以使用 repo init 命令使用exists repo.json 初始化项目 .

  • 58

    如果您对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方法 .

  • 25

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

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

  • 3

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

    另一个具体例子:

    就像我想从网址下载'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
    

    注意路径中的 trunk

    Edited: (as per Tommie C's comment)

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

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

    Edited: 如果树/ master不在url中那么叉它,它将在Forked url中 .

  • 141

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

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

    • 使用wget从GitHub获取数据(使用原始文件视图) .

    • 让上游项目将所需的数据子集发布为构建工件 .

    • 放弃并使用完整的结账 . 它在以下构建中没有太多麻烦 .

  • -1

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

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

  • 3

    此功能有两个选项:

    选项1:浏览器扩展

    Chrome扩展程序,Firefox插件

    用法:

    • 在任何GitHub存储库页面中 .

    • 只需双击您需要的项目 .

    • 点击右下方的下载按钮 .

    • 查看进度仪表板并等待浏览器触发器下载 .

    • 获取ZIP文件 .

    获取令牌:

    • 点击浏览器上的GitZip Extension图标 .

    • 除"Get Token"外,单击"Normal"或"Private"链接 .

    • 在Github auth页面上授权GitZip权限 .

    • 返回开头的回购页面 .

    • 继续使用 .


    选项2:Github gh-page

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

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

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

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

  • 13

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

相关问题