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

举个GitHub repo的例子:

git@github.com:foobar/Test.git

其目录结构:

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

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


当前回答

git稀疏校验

Git 2.25.0包含了一个新的实验性Git稀疏签出命令,它使现有功能更易于使用,同时还为大型存储库带来了一些重要的性能优势。(GitHub博客)

当前版本示例:

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

最值得注意的是

--稀疏仅将git存储库的顶级目录文件签入工作副本git稀疏签出add t增量添加/签出git的t子文件夹

其他要素

git稀疏签出init做了一些准备以启用部分签出--filter=blob:none通过只下载必要的git对象来优化数据获取(查看部分克隆功能以了解更多信息)--cone还通过应用更受限制的文件包含模式来提高性能


GitHub状态

GitHub仍在内部评估这一功能,尽管它在少数几个存储库上启用了[…]。随着该功能的稳定和成熟,我们将不断更新其进展。(文档)

其他回答

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

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

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

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

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

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

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特性,包括提交和推送更改的支持。

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

我在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访问权限(像我一样),可以在$HOME目录中创建一个.pydistutils.py文件,其中包含以下内容:[安装]用户=1easy_install lxml将正常工作(参考:https://stackoverflow.com/a/33464597/591257).