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

举个GitHub repo的例子:

git@github.com:foobar/Test.git

其目录结构:

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

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


当前回答

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

这种存档格式不包含任何git repo魔法,只包含被跟踪的文件本身(如果它们被跟踪的话,可能还有几个.gitignore文件,但你可以忽略它们:p)-这意味着如果代码发生变化,并且你想保持在顶部,你必须手动重新下载它,这也意味着你不能将其用作git存储库。。。

不确定在这种情况下,这是否是您想要的(再次,“下载”/查看vs“克隆”/开发),但它仍然很有用。。。

其他回答

如果您熟悉unix命令,则不需要特殊的依赖项或web应用程序。您可以将回购文件下载为tarball,并只下载您需要的内容。

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

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

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

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

~要打开终端,只需单击聚光灯并键入终端,然后点击enter

在Mac上,您可能已经拥有SVN(只需测试开放终端和键入“svn”或“which svn”~(不带引号)在Github上:通过单击repo中的特定文件夹名称,找到git文件夹(而不是repo)的Github路径从浏览器的地址栏复制路径打开终端并键入:svn export下一步粘贴地址(例如):https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI替换单词:tree/master带有单词:trunk键入文件的目标文件夹(在本例中,I将目标文件夹存储在当前用户)这里空格只是空格键而不是单词(空格)~/Downloads/HeadsUpUI最后一个终端命令显示下载文件夹(将地址与步骤5进行比较)svn导出https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI~/下载/HeadsUpUI

BTW-如果您在Windows或其他平台上,您可以在以下位置找到subversion(svn)的二进制下载http://subversion.apache.org

~如果您想签出文件夹而不是简单地下载它,请尝试使用svn帮助(tldr:replace export with checkout)

使现代化

关于恢复中断的下载/签出的评论。我会尝试先运行svn清理,然后再运行svn更新。请在SO中搜索其他选项。

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

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

}

然后用

source ~/.bashrc 

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

试试看。

https://github.com/twfb/git-directory-download

usage: gitd [-h] [-u URL] [-r] [-p] [--proxy PROXY]

optional arguments:
  -h, --help         show this help message and exit
  -u URL, --url URL  github url, split by ",", example: "https://x, http://y"
  -r, --raw          download from raw url
  -p, --parse        download by parsing html
  --proxy PROXY      proxy config, example "socks5://127.0.0.1:7891"

Example:
  1. download by raw url: gitd -u "https://github.com/twfb/git-directory-download"
  2. download by raw url: gitd -r -u "https://github.com/twfb/git-directory-download"
  3. dowmload by parsing: gitd -p -u "https://github.com/twfb/git-directory-download"
  4. download by raw url with proxy: gitd -r -u "https://github.com/twfb/git-directory-download" --proxy "socks5://127.0.0.1:7891"

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