g_i*_*rit 967 git directory file github repository
如何从GitHub上托管的远程Git仓库中仅下载特定文件夹或目录?
举个例子说GitHub repo住在这里:
git@github.com:foobar/Test.git
Run Code Online (Sandbox Code Playgroud)
其目录结构:
Test/
??? foo/
? ??? a.py
? ??? b.py
??? bar/
??? c.py
??? d.py
Run Code Online (Sandbox Code Playgroud)
我只想下载foo文件夹而不是克隆整个Test项目.
nic*_*ick 914
2016年9月更新:社区创建了一些可以为您执行此操作的工具:
Git不支持这个,但Github通过SVN做.如果你用subversion结账你的代码,Github将在后端基本上将repo从git转换为subversion,然后提供所请求的目录.
以下是使用此功能下载特定文件夹的方法.我将使用流行的JavaScript库lodash作为示例.
修改subversion的URL.我想/test从master分支机构下载文件夹,所以我会追加tree/master.现在是完整的URL trunk.请参阅下面的注释,以便更深入地解释我们必须使用此URL格式的原因.
下载文件夹.转到命令行并使用SVN获取文件夹.
https://github.com/lodash/lodash/tree/master/test
您可能没有立即看到任何活动,因为Github需要30秒才能转换更大的存储库,所以请耐心等待.
完整的URL格式说明:
- 如果您对
https://github.com/lodash/lodash/trunk/test分支感兴趣,请master改用.所以完整的道路是trunk- 如果您对
trunk/foldername分支感兴趣,请foo改用.完整路径看起来像branches/foo- Protip:
branches/foo/foldername如果您愿意,可以在下载之前查看可用的标签和分支
就这样!Github也支持更多的subversion功能,包括支持提交和推送更改.
Kin*_*ino 497
用法:
获取令牌:
http://kinolien.github.io/gitzip使用GitHub API和JSZip,FileSaver.js库.
步骤1:将github url输入到右上角的字段.
步骤2:按Enter键或直接单击下载下载zip或单击搜索查看子文件夹和文件列表.
步骤3:单击"下载Zip文件"或"获取文件"按钮以获取文件.
在大多数情况下,它工作正常,但该文件夹包含超过1,000个文件,因为Github Trees API限制.(指Github API#内容)
它还可以支持私人/公共回购和升级速率限制,如果您有GitHub帐户并在此站点中使用"获取令牌"链接.
Min*_*mal 451
现在,您可以直接下载或为DownGit中的任何GitHub公共目录或文件(特别大的文件)创建DOWNLOAD LINK!这是一个简单的演示 -
您还可以配置下载文件的属性详细用法.
Sto*_*ica 156
如果有svn,您可以使用svn export这样做:
svn export https://github.com/foobar/Test.git/trunk/foo
Run Code Online (Sandbox Code Playgroud)
请注意URL格式:
https://github.com//trunk 附在最后在运行之前svn export,最好首先验证目录的内容:
svn ls https://github.com/foobar/Test.git/trunk/foo
Run Code Online (Sandbox Code Playgroud)
Avi*_*kur 86
在尝试了所有答案后,对我来说最好的解决方案是:
优点:
转到任何存储库。(示例:https: //github.com/RespiraWorks/Ventilator/tree/master/software)
在 URL 中按.或替换.com为,以在 GitHub 的内部编辑器中打开存储库.dev
在资源管理器窗格(左侧或按Ctrl+ Shift+ E)中,右键单击所需的文件/文件夹,然后选择“下载”。
在“选择文件夹”对话框中,选择磁盘上您希望所选文件/文件夹所在的目录。
我尝试了其他解决方案,例如接受的答案,但是,
我不想仅仅为了这个而安装和学习SVN。
其他工具,如Download Directory、Refined GitHub、GitZip、DownGit要么需要 API 令牌,要么无法下载大型目录。
Rob*_*obW 70
如果要下载文件,而不是使用历史记录克隆存储库,则可以执行此操作git-archive.
git-archive制作git存储库的压缩zip或tar存档.一些让它变得特别的东西:
.git/文件夹,也不归档运行的存储库中的任何未跟踪文件.docs/usage从您使用ssh连接到的远程仓库创建目录存档的示例:
# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar
Run Code Online (Sandbox Code Playgroud)
Tom*_* C. 33
其他答案没有错,但我只是想我会分享那些第一次在这个过程中徘徊的人的分步说明.
〜要打开终端,只需单击聚光灯并键入终端然后按Enter键
顺便说一句 - 如果你在Windows或其他平台上,可以在http://subversion.apache.org找到subversion(svn)的二进制下载
〜如果你想签的文件夹,而不是简单地下载它尝试使用SVN帮助(tldr:更换出口与结账)
更新
关于恢复中断下载/结账的评论.我会尝试运行svn cleanup然后svn update.请搜索SO以获取其他选项.
小智 24
无论谁正在处理特定文件夹,他需要克隆该特定文件夹本身,所以请按照以下步骤**---使用SPARSE CHECKOUT ---**
第1步:创建目录.
第2步:初始化Git存储库.(git init)
第3步:启用稀疏检出.(git config core.sparsecheckout true)
第4步:告诉Git你想要哪些目录(echo 2015/brand/May(参考你想要工作的文件夹)>> .git/info/sparse-checkout)
第5步:添加远程(git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)
最后一步6:获取文件(git pull origin master)
Muh*_*nus 22
1.单击此链接http://kinolien.github.io/gitzip/
2.要下载的Github文件夹的粘贴链接.
3.点击搜索,它将显示所有要下载的文件.
注意: - 使用搜索不需要输入令牌密钥;)..保持简单(y)
jab*_*tta 21
有多种方法可以处理此问题,具体取决于您是要手动还是以编程方式执行此操作。
下面总结了四个选项。对于那些更喜欢动手解释的人,我整理了一个 YouTube 视频:从 GitHub 下载单个文件和文件夹。
另外,对于那些需要从 GitHub 下载单个文件(而不是文件夹)的人,我在 StackOverflow 上发布了类似的答案。
1. GitHub 用户界面
2. 第三方工具
https://github.com/babel/babel-eslint/tree/master/lib),然后按“下载”按钮。3.颠覆
svn export https://github.com/babel/babel-eslint/trunk/lib,然后按 Enter。4. GitHub API
https://api.github.com/repos/:owner/:repo/contents/:path。替换占位符后,示例端点为:https://api.github.com/repos/babel/babel-eslint/contents/lib. 这为您提供了该文件夹中存在的所有内容的 JSON 数据。数据包含您需要的一切,包括内容是文件夹还是文件、下载 URL(如果是文件)以及 API 端点(如果是文件夹)(以便您可以获取该文件夹的数据)。使用这些数据,脚本可以递归遍历目标文件夹中的所有内容,为嵌套文件夹创建文件夹,并下载每个文件夹的所有文件。查看DownGit 的代码以获得灵感。mic*_*slm 16
你不能; 与Subversion不同的是,每个子目录都可以单独检出,Git在整个存储库的基础上运行.
对于需要更细粒度访问的项目,您可以使用子模块 - 每个子模块都是一个单独的Git项目,因此可以单独克隆.
可以想象Git前端(例如GitHub的web界面,或gitweb)可以选择为您提供一个接口来提取给定的文件夹,但据我所知,他们都没有这样做(虽然他们确实让你下载单个文件,所以如果文件夹不包含太多文件,那么这是一个选项)
编辑 - GitHub实际上提供了通过SVN访问,这将允许你这样做(根据评论).有关如何执行此操作的最新说明,请参阅https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away
joh*_*nny 14
如果你真的只是想"下载"文件夹而不是"克隆"它(用于开发),那么最简单的方法就是获取最新版本的存储库(以及其中的文件夹/文件)的副本,无需克隆整个存储库甚至首先安装git,就是通过在GitHub上访问所需的存储库/ fork/branch/commit来下载zip存档(对于任何存储库,分支,分支,提交等) (例如,http(s)://github.com/<user>/<repo>/commit/<Sha1>对于特定提交后的文件副本)并选择Downloads右上角附近的按钮.
这种存档格式不包含任何git-repo魔法,只包含跟踪文件本身(如果跟踪它们可能还有一些.gitignore文件,但你可以忽略它们:p) - 这意味着如果代码发生了变化,你想要保持最佳状态,您必须手动重新下载它,这也意味着您将无法将其用作git存储库...
不确定在这种情况下你是否正在寻找(再次,"下载"/查看vs"克隆"/开发),但它仍然有用......
Gee*_*eek 12
ss到 GitHub URL 的开头:( github.com -> ssgithub.com )我构建了这个简单的网页来为您执行此操作,因此只需:
ss到地址栏中 URL 的开头单击“下载”应仅压缩该目录的内容并将其下载到您的设备。
[演示视频]
另一个具体例子:
就像我想从网址下载'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
Run Code Online (Sandbox Code Playgroud)
注意路径中的主干
编辑:(根据Tommie C的评论)
是的,使用导出 而不是checkout将提供一个干净的副本,而无需额外的git存储库文件.
svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo
Run Code Online (Sandbox Code Playgroud)
编辑:如果树/主人不在网址,然后叉它,它将在分叉网址.
git clone --filter 从 git 2.19 现在可以在 GitHub 上使用2020-09-18 测试,git 2.25.1。
此选项是与远程协议的更新一起添加的,它真正阻止了从服务器下载对象。
例如,仅克隆d1此存储库所需的对象:https : //github.com/cirosantilli/test-git-partial-clone我可以这样做:
git clone \
--depth 1 \
--filter=blob:none \
--no-checkout \
https://github.com/cirosantilli/test-git-partial-clone \
;
cd test-git-partial-clone
git checkout master -- d1
Run Code Online (Sandbox Code Playgroud)
我在以下位置更详细地介绍了这一点:Git:如何仅克隆 Git 存储库的子目录?
小智 8
您可以通过以下方式使用 git-svn。
第一,更换tree/master用trunk
的话,安装git-svn由sudo apt install git-svn
git svn clone https://github.com/lodash/lodash/trunk/test
Run Code Online (Sandbox Code Playgroud)
这样你就不必经历设置 svn 的痛苦,特别是对于 Windows 用户。
没有一个答案对我的情况有帮助。如果您正在为 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 请求的两步过程,但这几乎可以在任何平台上以任何语言实现。它可用于获取文件或目录。
小智 7
您可以将ghget与从地址栏复制的任何 URL 结合使用:
ghget https://github.com/fivethirtyeight/data/tree/master/airline-safety
Run Code Online (Sandbox Code Playgroud)
它是一个独立的可移植 shell 脚本,不使用 SVN(这对我来说在大型仓库中不起作用)。它也不使用 API,因此不需要令牌并且不受速率限制。
免责声明:我做到了。
这是SVN比Git更好的少数几个地方之一.
最后,我们倾向于三种选择:
有一个名为Python3的pip包githubdl可以执行此操作*:
export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo
Run Code Online (Sandbox Code Playgroud)
项目页面在这里
*免责声明:我写了这个程序包。
git sparse-checkoutGit 2.25.0包含一个新的实验性
git sparse-checkout命令,该命令使现有功能更易于使用,并为大型存储库提供了一些重要的性能优势。(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
Run Code Online (Sandbox Code Playgroud)
--sparse仅将git存储库的顶级目录文件检出到工作副本中git sparse-checkout add t增量添加/检出的t子文件夹git git sparse-checkout init 做一些准备以启用部分结帐--filter=blob:none通过仅下载必要的 git 对象来优化数据获取(查看部分克隆功能以获取更多信息)--cone 还通过应用更受限制的文件包含模式来提高性能GitHub 仍在内部评估此功能,同时它已在选定的几个存储库中启用 [...]。随着该功能的稳定和成熟,我们会及时向您通报其进展情况。(文档)
这就是我用git v2.25.0做的,也用 v2.26.2 测试过。此技巧不适用于 v2.30.1
git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
cd opencv
# requires git 2.25.x to 2.26.2
git sparse-checkout set data/haarcascades
Run Code Online (Sandbox Code Playgroud)
您可以使用Docker来避免安装特定版本的 git
git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
cd opencv
# requires git 2.25.x to 2.26.2
docker run --rm -it -v $PWD/:/code/ --workdir=/code/ alpine/git:v2.26.2 sparse-checkout set data/haarcascades
Run Code Online (Sandbox Code Playgroud)
# bare minimum clone of opencv
$ git clone --no-checkout --filter=tree:0 https://github.com/opencv/opencv
...
Resolving deltas: 100% (529/529), done.
# Downloaded only ~7.3MB , takes ~3 seconds
# du = disk usage, -s = summary, -h = human-readable
$ du -sh opencv
7.3M opencv/
# Set target dir
$ cd opencv
$ git sparse-checkout set data/haarcascades
...
Updating files: 100% (17/17), done.
# Takes ~10 seconds, depending on your specs
# View downloaded files
$ du -sh data/haarcascades/
9.4M data/haarcascades/
$ ls data/haarcascades/
haarcascade_eye.xml haarcascade_frontalface_alt2.xml haarcascade_licence_plate_rus_16stages.xml haarcascade_smile.xml
haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalface_alt_tree.xml haarcascade_lowerbody.xml haarcascade_upperbody.xml
haarcascade_frontalcatface.xml haarcascade_frontalface_default.xml haarcascade_profileface.xml
haarcascade_frontalcatface_extended.xml haarcascade_fullbody.xml haarcascade_righteye_2splits.xml
haarcascade_frontalface_alt.xml haarcascade_lefteye_2splits.xml haarcascade_russian_plate_number.xml
Run Code Online (Sandbox Code Playgroud)
您可以简单下载目录树:
git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -
Run Code Online (Sandbox Code Playgroud)
但是,如果您打算将其签出,并且能够进行提交并将其推回原位,那么您就不能这样做。
只是为了放大上面的答案,从真实的 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
Run Code Online (Sandbox Code Playgroud)
有时,一个具体的例子有助于阐明所提出的替代方案。
我使用 linux 所以,把它放在 ~/.bashrc 中,甚至称为 :D $HOME/.bashrc
git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}
}
Run Code Online (Sandbox Code Playgroud)
然后刷新外壳
source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
然后将它与 git-downloadfolder blablabla 一起使用:D
如果您对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
Run Code Online (Sandbox Code Playgroud)
*/)的开头部分以匹配任何目录。Github使用名称中的commit ref创建了一个包装器目录,因此无法知道。--strip-components的斜杠(/)数量相同。这将下载整个tarball。如果必须避免这种情况,或者如果您想对GitHub服务器友好,请使用其他答案中提到的SVN方法。
无论出于何种原因,该svn解决方案对我不起作用,而且由于我不需要svn其他任何东西,因此花时间尝试制作它是没有意义的,因此我使用我已有的工具寻找了一个简单的解决方案。此脚本仅使用curl和awk下载 GitHub 目录中描述为 的所有文件"/:user:repo/contents/:path"。
GitHub REST API"GET /repos/:user:repo/contents/:path"命令调用的返回正文
返回一个对象,其中包含"download_url"目录中每个文件的链接。
此命令行脚本使用 REST API 调用该 REST API,curl并通过 AWK 发送结果,AWK 会过滤掉除“download_url”之外的所有行,删除链接中的引号和逗号,然后使用另一个 curl 调用下载链接。
curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
'/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'
Run Code Online (Sandbox Code Playgroud)
cd %ProgramFiles%\SlikSvn\binhttps://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samplestree/develop
或tree/master使用trunksvn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
599807 次 |
| 最近记录: |