如何从GitHub上托管的远程Git存储库中仅下载特定文件夹或目录?
假设示例GitHub存储库位于此处:
git@github.com:foobar/Test.git
其目录结构:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
我只想下载foo文件夹,而不克隆整个Test项目。
#1楼
这是SVN比Git更好的少数几个地方之一。
最后,我们倾向于以下三种选择:
- 使用wget从GitHub抓取数据(使用原始文件视图)。
- 让上游项目将所需的数据子集发布为构建工件。
- 放弃并使用完整的结帐。 在第一个版本中这是一个很大的成功,但是除非您获得大量流量,否则在后续版本中不会有太多麻烦。
#2楼
如果要下载的目录是一个单独的库,最好创建另一个git repo,然后再使用git子模块功能。
当然,您必须是您想要的初始回购的所有者
#3楼
对于通用git Repo:
如果要下载文件,而不是使用历史记录克隆存储库,则可以使用git-archive
。
git-archive
创建git存储库的压缩zip或tar存档。 一些使它特别的东西:
- 您可以选择git存储库中要归档的文件或目录。
- 它不会在运行它的存储库中存档
.git/
文件夹或任何未跟踪的文件。 - 您可以存档特定的分支,标记或提交。 使用git管理的项目经常使用它来生成项目版本的存档(测试版,发行版,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
关于GitHub Repos的注意事项:
#4楼
2016年9月更新:社区创建了一些工具可以为您做到这一点:
Git不支持此功能,但是Github通过SVN支持。 如果您使用subversion签出代码,Github实际上将在后端将仓库从git转换为subversion,然后提供所请求的目录。
这是使用此功能下载特定文件夹的方法。 我将以流行的javascript库lodash
为例。
修改用于Subversion的URL 。 将
tree/master
替换为trunk
。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/foldername
- 提示:如果愿意,可以在下载前使用
svn ls
查看可用的标签和分支
就这样! Github还支持更多的Subversion功能 ,包括对提交和推送更改的支持。
#5楼
如果您具有svn
,则可以使用svn export
来执行此操作:
svn export https://github.com/foobar/Test.git/trunk/foo
注意URL格式:
- 基本URL是
https://github.com/
-
/trunk
附加在末尾
在运行svn export
之前,最好先使用以下命令验证目录的内容:
svn ls https://github.com/foobar/Test.git/trunk/foo
#6楼
如果您需要以编程方式进行操作并且不想依赖SVN,则可以使用GitHub API递归下载所有内容。
为了获得灵感,这是我的红宝石要点: https : //gist.github.com/cvengros/b2a7e82f66519d423b6f
#7楼
只是为了扩大上面的答案,从真实的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
有时,一个具体的例子有助于阐明提议的替代方案。
#8楼
无论是谁正在处理特定文件夹,他都需要克隆该特定文件夹本身,为此,请使用稀疏签出执行以下步骤。
创建一个目录。
初始化一个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
)
#9楼
另一个具体示例:
就像我想从网址下载“ 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
注意路径中的树干
编辑:(根据Tommie C的评论)
是的,使用export而不是checkout可以得到干净的副本,而无需额外的git存储库文件。
svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo
编辑:如果树/母版不在URL中,则将其分叉,它将在分叉URL中。
#10楼
我创建了一个名为GitHubFolderDownloader的开源项目。 它使您可以下载存储库的单个文件夹,而无需克隆或下载整个存储库。
#11楼
其他答案没什么问题,但我只是想与那些第一次在此过程中徘徊的人分享逐步说明。
如何从github存储库(Mac OS X)下载单个文件夹:
〜要打开终端,只需单击聚光灯并键入终端,然后按Enter
- 在Mac上,您可能已经拥有SVN(要测试打开的终端,然后键入“ svn”或“哪个svn” 〜而不带引号)
- 在Github上:通过单击存储库中的特定文件夹名称,找到git文件夹(而非存储库)的Github路径
- 从浏览器的地址栏中复制路径
- 打开终端并输入: svn export
- 接下来粘贴地址(例如): https : //github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
- 替换单词: tree / master
- 词: 树干
- 键入文件的目标文件夹(在此示例中,我将目标文件夹存储在当前用户的“下载”文件夹中)
- 这里的空格只是空格键,而不是单词(空格)〜/ Downloads / HeadsUpUI
- 最终的终端命令显示了下载文件夹的完整命令(将地址与第5步进行比较) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI〜/ Downloads / HeadsUpUI
顺便说一句-如果您使用Windows或其他平台,则可以在http://subversion.apache.org中找到Subversion(svn)的二进制下载。
〜如果要检出文件夹而不是简单地下载文件夹,请尝试使用svn帮助(tldr:将输出替换为checkout )
更新资料
关于恢复中断的下载/签出的评论。 我会尝试运行svn cleanup
然后执行svn update
。 请在SO中搜索其他选项。
#12楼
要从GitHub导出目录,请将目录网址中的“ / 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
#13楼
此功能有两个选项:
选项1:浏览器扩展
用法:
- 在任何GitHub存储库页面中。
- 只需双击所需项目的空白部分。
- 点击右下角的下载按钮。
- 查看进度仪表板,然后等待浏览器触发器下载。
- 获取ZIP文件。
获取令牌:
- 单击浏览器上的GitZip Extension图标。
- 点击“获取令牌”旁边的“普通”或“私人”链接。
- 在Github身份验证页面上授权GitZip权限。
- 回到开始的回购页面。
- 继续使用。
选项2:Github gh页
http://kinolien.github.io/gitzip ,使用GitHub API和JSZip,FileSaver.js库。
步骤1:在右上角的字段中输入github网址。
步骤2:按Enter键或单击“下载”以直接下载zip或单击“搜索”以查看子文件夹和文件的列表。
步骤3:点击“下载Zip文件”或“获取文件”按钮以获取文件。
在大多数情况下,它都可以正常工作,但由于Github Trees API的限制,该文件夹包含1,000个以上的文件。 (参考Github API#Contents )
如果您拥有GitHub帐户并在此站点中使用“获取令牌”链接,它还可以支持私有/公共存储库并升级速率限制。
#14楼
我们的团队编写了一个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
#15楼
1.单击此链接http://kinolien.github.io/gitzip/
2.粘贴您要下载的Github文件夹的链接。
3.单击搜索,将显示所有文件供下载。
注意:-使用搜索,无需输入令牌密钥;)..保持简单!
#16楼
转到DownGit >输入您的URL>下载!
现在,您可以从DownGit 直接为任何GitHub公共目录或文件( 特别是大文件 ) 直接下载或创建下载链接 ! 这是一个简单的演示-
您还可以配置下载文件的属性详细用法 。
#17楼
我使用的CentOS 7服务器没有root访问权限,也没有git,svn等(也不想!),因此制作了一个python脚本来下载任何github文件夹: https : //github.com/andrrrl/github -文件夹下载器
用法很简单,只需从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=1
并且easy_install lxml
可以正常使用(参考: https:// stackoverflow .com / a / 33464597/591257 )。
#18楼
我使用linux所以,把它放在〜/ .bashrc中,甚至命名为:D $ HOME / .bashrc
git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}
}
然后用刷新外壳
source ~/.bashrc
然后与git-downloadfolder blablabla一起使用:D
#19楼
有一个叫做githubdl
的Python3 pip包可以做到这一点*:
export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo
项目页面在这里
*免责声明:我写了这个程序包。
#20楼
在我的情况下,所有答案均无济于事。 如果您正在为Windows开发,则可能没有svn。 在许多情况下,不能指望用户安装Git或由于其他原因不想下载整个存储库。 回答了这个问题的一些人,例如Willem van Ketwich和Aztack,为完成这项任务提供了工具。 但是,如果该工具不是针对您使用的语言编写的,或者您不想安装第三方库,则这些工具将无效。
但是,有一种更简单的方法。 GitHub有一个API,可让您使用GET请求下载单个文件或整个目录的内容。 您可以使用https://api.github.com/repos/:owner/:repo_name/contents/:path
访问目录,该目录返回一个JSON对象,枚举该目录中的所有文件。 枚举中包含指向文件原始内容的链接download_url
参数。 然后可以使用该URL下载该文件。
这是一个两步过程,需要能够发出GET请求,但这可以在几乎任何语言,任何平台上实现。 它可以用来获取文件或目录。
#21楼
如果您对Unix命令感到满意,则不需要特殊的依赖项或Web应用程序。 您可以将压缩包下载为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文件或特定的分支/引用)
- 保留路径的开头部分(
*/
)以匹配任何目录。 Github使用名称中的commit ref创建了一个包装器目录,因此无法知道。 - 您可能希望
--strip-components
与路径中的斜杠(/
)相同(上一个参数)。
这将下载整个tarball。 如果必须避免这种情况,或者如果您想对GitHub服务器友好,请使用其他答案中提到的SVN方法。
#22楼
使用此功能,第一个参数是文件夹的URL,第二个参数是将文件夹下载到的位置:
function github-dir() {
svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"
}
#23楼
如果要使用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/
#24楼
一个简单的答案是先从下面的链接开始乌龟svn。
安装时打开CLI选项,以便可以从命令行界面使用它。
复制git hub子目录链接。
例
https://github.com/tensorflow/models/tree/master/research/deeplab
用树干替换树/主树
并做
svn结帐https://github.com/tensorflow/models/trunk/research/deeplab
文件将下载到当前目录的deeplab文件夹中。
#25楼
来自Git 2.19的git clone --filter
此选项实际上将跳过从服务器获取不需要的对象的操作:
git clone --depth 1 --no-checkout --filter=blob:none \
"file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/
服务器应配置为:
git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1
v2.19.0中对Git远程协议进行了扩展以支持此功能,但当时不支持服务器。 但是它已经可以在本地测试。
我已经在以下文章中进行了详细介绍: 如何仅克隆Git存储库的子目录?
#26楼
你不能; 与Subversion不同,在Subversion中每个子目录都可以单独检出,Git在整个存储库的基础上运行。
对于需要更细粒度访问的项目,可以使用子模块-每个子模块都是一个单独的Git项目,因此可以单独克隆。
可以想象,一个Git前端(例如GitHub的Web界面或gitweb)可以选择提供一个接口以供您提取给定的文件夹,但据我所知,它们都没有这样做(尽管它们确实允许您下载单个文件) ,因此,如果文件夹中没有太多文件,则可以选择)
编辑 -GitHub实际上提供了通过SVN的访问,这将允许您执行此操作(根据评论)。 有关如何执行此操作的最新说明,请参见https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away
#27楼
您可以简单下载目录树:
git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -
但是,如果您打算将其签出,并且能够进行提交并将其推回原位,那么您就不能这样做。
#28楼
如果您确实只想“下载”该文件夹而不是“克隆 ”该文件夹(以进行开发),那么最简单的方法就是简单地获取该存储库的最新版本(以及其中的一个文件夹/文件)的副本 ,无需克隆整个存储库甚至无需首先安装git,只需在GitHub上所需的存储库/ fork / branch / commit上下载zip归档文件(用于任何存储库,fork,branch,commit等)。 (例如,使用http(s)://github.com/<user>/<repo>/commit/<Sha1>
复制特定提交后的文件副本),然后选择右上角附近的“ Downloads
按钮。
这种存档格式不包含任何git-repo魔术,仅包含被跟踪的文件本身(如果被跟踪,则可能包含几个.gitignore文件,但是您可以忽略那些:p)-这意味着如果代码更改并且您想要保持在最前面,您必须手动重新下载它,这也意味着您将无法将其用作git存储库...
不确定在这种情况下这是否是您要寻找的内容(再次是“下载” /视图与“克隆” /开发),但是它仍然很有用...
来源:CSDN
作者:p15097962069
链接:https://blog.csdn.net/p15097962069/article/details/103791379