关于git:从GitHub仓库下载单个文件夹或目录

Download a single folder or directory from a GitHub repo

如何仅从承载在GitHub上的远程Git报告下载特定文件夹或目录?

假设Github回购的例子就在这里:

1
[email protected]:foobar/Test.git

其目录结构:

1
2
3
4
5
6
7
Test/
    foo/
       a.py
       b.py
    bar/
       c.py
       d.py

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


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

  • Gitzp(归功于Kino-在这里投票给他的答案!)

  • 唐吉特(归功于米哈斯·卡马尔-在这里给他的答案投赞成票!)

Git不支持这个,但Github通过SVN支持。如果用subversion签出代码,那么github基本上将把repo从git转换为后端的subversion,然后提供请求的目录。

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

  • 获取回购URL。首先,将github repo的URL复制到剪贴板。github repo URL example

  • 修改Subversion的URL。我想从master分公司下载/docs的文件夹,所以我将追加trunk/docs。完整的URL现在是https://github.com/lodash/lodash/trunk/docs。请参阅下面我的注释,以更深入地解释为什么必须使用此URL格式。

  • 下载文件夹。转到命令行,用svn抓取文件夹。埃多克斯1〔5〕

  • 您可能不会立即看到任何活动,因为GitHub转换较大的存储库需要30秒,所以请耐心等待。

    Full URL format explanation:

    • If you're interested in master branch, use trunk instead. So the full path is trunk/foldername
    • If you're interested in foo branch, use branches/foo instead. The
      full path looks like branches/foo/foldername
    • Protip: You can use svn ls to see available tags and branches before downloading if you wish

    这就是全部!Github还支持更多的Subversion特性,包括对提交和推送更改的支持。


    此功能有两个选项:选项1:浏览器扩展

    Chrome Extension, Firefox Addon

    用途:

  • 在任何Github回购页面中。
  • 只需双击需要的项目的空白部分即可。
  • 单击右下角的"下载"按钮。
  • 请参阅进度仪表板并等待浏览器触发器下载。
  • 获取zip文件。
  • 获取令牌:

  • 单击浏览器上的Gitzip扩展图标。
  • 单击"获取令牌"旁边的"普通"或"私有"链接。
  • 在Github身份验证页上授权GitZip权限。
  • 回到开头的回购页面。
  • 继续使用。
  • 选项2:Github GH页面

    http://kinolien.github.io/gitzip by using GitHub API, and JSZip, FileSaver.js libraries.

    步骤1:在右上角的字段中输入Github URL。第2步:按Enter键或直接单击下载zip或单击搜索查看子文件夹和文件列表。第三步:点击"下载zip文件"或"获取文件"按钮获取文件。

    在大多数情况下,除了文件夹包含1000多个文件之外,由于GitHub树API的限制,它工作得很好。(参考Github API内容)

    如果您有Github帐户,并且在此站点中使用"get token"链接,它还可以支持私有/公共回购并升级利率限制。


    进入downgit>输入你的URL>下载!

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

    DownGit

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


    如果您有svn,您可以使用svn export来执行此操作:

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

    注意URL格式:

    • 基本URL是https://github.com/
    • 末尾附加/trunk

    在运行svn export之前,最好先用以下方法验证目录的内容:

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


    对于一般的Git回购:

    如果您想下载文件,而不是克隆具有历史记录的存储库,您可以使用git-archive来实现这一点。

    git-archive生成Git存储库的压缩zip或tar存档。一些特殊的东西:

  • 您可以选择要存档的Git存储库中的文件或目录。
  • 它不会将.git/文件夹或运行的存储库中的任何未跟踪文件存档。
  • 您可以存档特定的分支、标记或提交。使用Git管理的项目经常使用它来生成项目版本的存档(beta、release、2.0等),供用户下载。
  • 从与ssh连接的远程repo创建docs/usage目录存档的示例:

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

    有关详细信息,请参阅此博客文章和git文档。

    关于Github回购的说明:

    Github不允许git-archive访问。???


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


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

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

    ~ To open Terminal just click spotlight and type terminal then hit enter

  • 在Mac上,您可能已经有了SVN(只测试开放终端和键入"svn"或"which svn"~不带引号)
  • 在GitHub上:通过单击回购中的特定文件夹名称,找到Git文件夹(而不是回购)的GitHub路径。
  • 从浏览器的地址栏复制路径
  • 开放式终端和类型:SVN导出
  • 下一个粘贴地址(例如):https://github.com/mingsai/sample-code/tree/master/headupui
  • 替换单词:tree/master
  • 用"树干"这个词
  • 键入文件的目标文件夹(在本例中,我将目标文件夹存储在当前用户)
  • 这里的空格只是空格键,而不是单词(空格)~/downloads/headsupui。
  • 最后一个终端命令显示下载文件夹(将地址与步骤5比较)SVN导出https://github.com/mingsai/sample-code/trunk/headsupui~/下载/headupui
  • btw-如果您在Windows或其他平台上,您可以在http://subversion.apache.org上找到Subversion(SVN)的二进制下载。

    ~ If you want to checkout the folder rather than simply download it try using the svn help (tldr: replace export with checkout)

    更新

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


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

  • 创建一个目录。

  • 初始化Git存储库。(git init号)

  • 启用稀疏签出。(git config core.sparsecheckout true号)

  • 告诉Git你想要哪个目录(echo 2015/brand/may(参考你想使用的文件夹)>>.git/info/sparse-checkout

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

  • 获取文件(git pull origin master)


  • 您不能这样做;与Subversion不同,在Subversion中每个子目录都可以单独签出,Git在整个存储库基础上运行。

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

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

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


    如果您真的只想"下载"文件夹而不想"克隆"它(用于开发),那么最简单的方法就是简单地获取存储库的最新版本的副本(因此其中的文件夹/文件),而不需要克隆整个repo,甚至不需要首先安装git。通过转到Github上所需的repo/fork/branch/commit(例如,http(s)://github.com///commit/以获取特定提交后的文件副本)并选择右上角附近的Downloads按钮,下载zip存档文件(对于任何repo、fork、branch、commit等)。

    这个存档格式不包含任何git repo魔力,只包含跟踪文件本身(如果跟踪了,可能还有一些.git ignore文件,但可以忽略这些:p)-这意味着如果代码发生更改,并且您希望保持在最上面,您必须手动重新下载它,它也包括我如果你不能把它作为Git存储库…

    不确定这是否是您在本例中要查找的内容(同样是"下载"/"查看"与"克隆"/"开发"),但它仍然有用…


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


    另一个具体例子:

    就像我想从URL下载"iOS Pro geo"文件夹一样

    https://github.com/alokc83/apress books源代码-/tree/master/%20pro%20ios%20geo

    我可以通过

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

    注意路径中的主干

    编辑:(根据Tommie C的意见)

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

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

    已编辑:如果URL中没有树/主控形状,则将其分叉,并将其分叉。


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

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

    项目页面在这里

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


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

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

  • 使用wget从github获取数据(使用原始文件视图)。
  • 让上游项目将所需的数据子集发布为构建工件。
  • 放弃并使用全额结帐。它在第一个构建中受到了很大的影响,但是除非您有大量的流量,否则在接下来的构建中不会有太多的麻烦。

  • 如果您对Unix命令感到满意,那么就不需要特殊的依赖项或Web应用程序。你可以下载回购作为一个tarball和untar只有你需要的。

    示例(fontawome子目录中的woff2文件):

    1
    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/获取存档链接(包括如何获取zip文件或特定分支/refs)
    • 保留路径的初始部分(*/以匹配任何目录。Github创建了一个名为commit-ref的包装目录,因此无法知道该目录。
    • 您可能希望--strip-components与路径(前面的参数)中的斜杠(/)量相同。

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


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

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

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


    我使用Linux,所以把它放在~/.bashrc中,称为even:d$home/.bashrc。

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

    }

    然后用刷新shell

    1
    source ~/.bashrc

    然后与git downloadfolder blablabla:d一起使用


    为了进一步说明上述答案,从真正的Github存储库到本地目录的一个实际示例是:

    1
    2
    3
    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

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


    我们的团队编写了一个bash脚本来实现这一点,因为我们不想在裸机服务器上安装SVN。

    https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh

    它使用github API,可以从命令行运行,如下所示:

    1
    git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs


    所有的答案对我的处境都没有帮助。如果您正在为Windows开发,则可能没有SVN。在许多情况下,人们也不能指望用户安装了Git,或者由于其他原因不想下载整个存储库。回答这个问题的一些人,比如威廉·范·凯特维奇和阿扎克,制造了完成这个任务的工具。但是,如果该工具不是为您所使用的语言编写的,或者您不想安装第三方库,这些功能将无法正常工作。

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

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


    我在Centos7服务器上工作,在这些服务器上我没有根访问权,也没有git、svn等(也不想!)所以制作了一个python脚本来下载任何github文件夹:https://github.com/andrrl/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一起安装如果您没有根目录访问权限(像我一样),您可以使用以下内容在$HOME目录中创建一个.pydistutils.py文件:江户十一〔四〕号而easy_install lxml只会起作用(参考:https://stackoverflow.com/a/33464597/591257)。


    要从Github导出目录,请将目录URL中的"/tree/master/"替换为"/trunk/"。

    例如,要从以下URL导出目录:

    1
    https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

    运行以下命令:

    1
    svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet


    如果您需要通过编程来实现,并且不想依赖SVN,那么可以使用GithubAPI递归地下载所有内容。

    关于灵感,请看我的红宝石主题:https://gist.github.com/cvengros/b2a7e82f66519d423b6f


    来自Git 2.19的git clone --filter

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

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

    服务器应配置为:

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

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

    我已经在下面更详细地介绍了这一点:如何只克隆Git存储库的子目录?


    对此,一个简单的答案是首先从下面的链接中选择乌龟SVN。

    https://tortoisesvn.net/downloads.html

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

    复制Git Hub子目录链接。

    Example

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

    用树干替换树/主

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

    并且做

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

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


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

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

    如果要使用python和svn下载特定的github目录,请使用以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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/


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

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