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

举个GitHub repo的例子:

git@github.com:foobar/Test.git

其目录结构:

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

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


当前回答

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

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

其他回答

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

您可以将ghget与从地址栏复制的任何URL一起使用:

ghget https://github.com/fivethirtyeight/data/tree/master/airline-safety

这是一个独立的可移植shell脚本,不使用SVN(这对我来说在大型回购中不起作用)。它也不使用API,因此不需要令牌,也不受速率限制。

免责声明:我做到了。

对于通用git Repo:

如果您想下载文件,而不是克隆具有历史记录的存储库,可以使用gitarchive来完成此操作。

gitarchive生成git存储库的压缩zip或tar存档。让它与众不同的一些东西:

您可以选择git存储库中要归档的文件或目录。它不会将.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.tar

更多信息请参阅本博客文章和git文档。

GitHub Repos注意事项:

GitHub不允许git存档访问。☹️

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

你可以尝试为chrome使用gitzip扩展,它超级容易使用,而且以前也帮我下载了很多文件夹!