本文共 8118 字,大约阅读时间需要 27 分钟。
如何从上托管的远程Git存储库中仅下载特定文件夹或目录?
假设示例GitHub存储库位于此处:
git@github.com:foobar/Test.git
其目录结构:
Test/├── foo/ │ ├── a.py│ └── b.py └── bar/ ├── c.py └── d.py
我只想下载foo文件夹,而不克隆整个Test项目。
这是SVN比Git更好的少数几个地方之一。
最后,我们倾向于以下三种选择:
如果要下载的目录是一个单独的库,最好创建另一个git repo,然后再使用git子模块功能。
当然,您必须是您想要的初始回购的所有者
如果要下载文件,而不是使用历史记录克隆存储库,则可以使用git-archive
。
git-archive
创建git存储库的压缩zip或tar存档。 一些使它特别的东西:
.git/
文件夹或任何未跟踪的文件。 从与ssh连接的远程存储库中创建docs/usage
目录的存档的示例:
# in terminal$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar
更多信息,请参见和 。
。 ☹️
2016年9月更新:社区创建了一些工具可以为您做到这一点:
Git不支持此功能,但是Github通过SVN支持。 如果您使用subversion签出代码,Github实际上将在后端将仓库从git转换为subversion,然后提供所请求的目录。
这是使用此功能下载特定文件夹的方法。 我将以流行的javascript库lodash
为例。
导航到要下载的文件夹 。 让我们从master
分支下载/test
。
修改用于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还 ,包括对提交和推送更改的支持。
如果您具有svn
,则可以使用svn export
来执行此操作:
svn export https://github.com/foobar/Test.git/trunk/foo
注意URL格式:
https://github.com/
/trunk
附加在末尾 在运行svn export
之前,最好先使用以下命令验证目录的内容:
svn ls https://github.com/foobar/Test.git/trunk/foo
如果您需要以编程方式进行操作并且不想依赖SVN,则可以使用GitHub API递归下载所有内容。
为了获得灵感,这是我的红宝石要点: :
只是为了扩大上面的答案,从真实的GitHub存储库到本地目录的真实示例是:
svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfacessvn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces /temp/SvnExport/Washburn
有时,一个具体的例子有助于阐明提议的替代方案。
无论是谁正在处理特定文件夹,他都需要克隆该特定文件夹本身,为此,请使用稀疏签出执行以下步骤。
创建一个目录。
初始化一个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
)
另一个具体示例:
就像我想从网址下载“ iOS Pro Geo”文件夹
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中。
我创建了一个名为开源项目。 它使您可以下载存储库的单个文件夹,而无需克隆或下载整个存储库。
其他答案没什么问题,但我只是想与那些第一次在此过程中徘徊的人分享逐步说明。
〜要打开终端,只需单击聚光灯并键入终端,然后按Enter
顺便说一句-如果您使用Windows或其他平台,则可以在找到Subversion(svn)的二进制下载。
〜如果要检出文件夹而不是简单地下载文件夹,请尝试使用svn帮助(tldr:将输出替换为checkout )
更新资料
关于恢复中断的下载/签出的评论。 我会尝试运行svn cleanup
然后执行svn update
。 请在SO中搜索其他选项。
要从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
,
用法:
获取令牌:
,使用GitHub API和JSZip,FileSaver.js库。
步骤1:在右上角的字段中输入github网址。
步骤2:按Enter键或单击“下载”以直接下载zip或单击“搜索”以查看子文件夹和文件的列表。 步骤3:点击“下载Zip文件”或“获取文件”按钮以获取文件。在大多数情况下,它都可以正常工作,但由于Github Trees API的限制,该文件夹包含1,000个以上的文件。 (参考 )
如果您拥有GitHub帐户并在此站点中使用“获取令牌”链接,它还可以支持私有/公共存储库并升级速率限制。
我们的团队编写了一个bash脚本来执行此操作,因为我们不想在裸机服务器上安装SVN。
它使用github API,可以从命令行运行,如下所示:
git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs
1.单击此链接
2.粘贴您要下载的Github文件夹的链接。 3.单击搜索,将显示所有文件供下载。 注意:-使用搜索,无需输入令牌密钥;)..保持简单!现在,您可以从 直接为任何GitHub公共目录或文件( 特别是大文件 ) 直接下载或创建下载链接 ! 这是一个简单的演示-
您还可以配置下载文件的属性 。
我使用的CentOS 7服务器没有root访问权限,也没有git,svn等(也不想!),因此制作了一个python脚本来下载任何github文件夹: :
用法很简单,只需从github项目中复制相关部分,假设该项目为 ,并且您需要一个仅包含一些源文件的文件夹,那么您需要做类似的事情:
$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
它需要库,可以通过easy_install lxml
安装
$HOME
目录中创建一个.pydistutils.py
文件,其中包含以下内容: [install] user=1
并且easy_install lxml
可以正常使用(参考: )。 我使用linux所以,把它放在〜/ .bashrc中,甚至命名为:D $ HOME / .bashrc
git-dowloadfolder(){a="$1"svn checkout ${a/tree\/master/trunk}}
然后用刷新外壳
source ~/.bashrc
然后与git-downloadfolder blablabla一起使用:D
有一个叫做githubdl
的Python3 pip包可以做到这一点*:
export GIT_TOKEN=1234567890123456789012345678901234567890123pip install githubdlgithubdl -u http://github.com/foobar/test -d foo
项目页面在
*免责声明:我写了这个程序包。
在我的情况下,所有答案均无济于事。 如果您正在为Windows开发,则可能没有svn。 在许多情况下,不能指望用户安装Git或由于其他原因不想下载整个存储库。 回答了这个问题的一些人,例如Willem van Ketwich和Aztack,为完成这项任务提供了工具。 但是,如果该工具不是针对您使用的语言编写的,或者您不想安装第三方库,则这些工具将无效。
但是,有一种更简单的方法。 GitHub有一个API,可让您下载单个文件或整个目录的内容。 您可以使用https://api.github.com/repos/:owner/:repo_name/contents/:path
访问目录,该目录返回一个JSON对象,枚举该目录中的所有文件。 枚举中包含指向文件原始内容的链接download_url
参数。 然后可以使用该URL下载该文件。
这是一个两步过程,需要能够发出GET请求,但这可以在几乎任何语言,任何平台上实现。 它可以用来获取文件或目录。
如果您对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
*/
)以匹配任何目录。 Github使用名称中的commit ref创建了一个包装器目录,因此无法知道。 --strip-components
与路径中的斜杠( /
)相同(上一个参数)。 这将下载整个tarball。 如果必须避免这种情况,或者如果您想对GitHub服务器友好,请使用其他答案中提到的SVN方法。
使用此功能,第一个参数是文件夹的URL,第二个参数是将文件夹下载到的位置:
function github-dir() { svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2" }
如果要使用Python和SVN下载特定的GitHub目录,请使用以下代码:
import validatorsfrom svn.remote import RemoteClientdef 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搜索和下载提示: :
一个简单的答案是先从下面的链接开始乌龟svn。
安装时打开CLI选项,以便可以从命令行界面使用它。
复制git hub子目录链接。
例
用树干替换树/主树
并做
svn结帐
文件将下载到当前目录的deeplab文件夹中。
来自Git 2.19的git clone --filter
此选项实际上将跳过从服务器获取不需要的对象的操作:
git clone --depth 1 --no-checkout --filter=blob:none \ "file://$(pwd)/server_repo" local_repocd local_repogit checkout master -- mydir/
服务器应配置为:
git config --local uploadpack.allowfilter 1git config --local uploadpack.allowanysha1inwant 1
v2.19.0中对Git远程协议进行了扩展以支持此功能,但当时不支持服务器。 但是它已经可以在本地测试。
我已经在以下文章中进行了详细介绍:
你不能; 与Subversion不同,在Subversion中每个子目录都可以单独检出,Git在整个存储库的基础上运行。
对于需要更细粒度访问的项目,可以使用子模块-每个子模块都是一个单独的Git项目,因此可以单独克隆。
可以想象,一个Git前端(例如GitHub的Web界面或gitweb)可以选择提供一个接口以供您提取给定的文件夹,但据我所知,它们都没有这样做(尽管它们确实允许您下载单个文件) ,因此,如果文件夹中没有太多文件,则可以选择)
编辑 -GitHub实际上提供了通过SVN的访问,这将允许您执行此操作(根据评论)。 有关如何执行此操作的最新说明,请参见
您可以简单下载目录树:
git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -
但是,如果您打算将其签出,并且能够进行提交并将其推回原位,那么您就不能这样做。
如果您确实只想“下载”该文件夹而不是“克隆 ”该文件夹(以进行开发),那么最简单的方法就是简单地获取该存储库的最新版本(以及其中的一个文件夹/文件)的副本 ,无需克隆整个存储库甚至无需首先安装git,只需在GitHub上所需的存储库/ fork / branch / commit上下载zip归档文件(用于任何存储库,fork,branch,commit等)。 (例如,使用http(s)://github.com/<user>/<repo>/commit/<Sha1>
复制特定提交后的文件副本),然后选择右上角附近的“ Downloads
按钮。
这种存档格式不包含任何git-repo魔术,仅包含被跟踪的文件本身(如果被跟踪,则可能包含几个.gitignore文件,但是您可以忽略那些:p)-这意味着如果代码更改并且您想要保持在最前面,您必须手动重新下载它,这也意味着您将无法将其用作git存储库...
不确定在这种情况下这是否是您要寻找的内容(再次是“下载” /视图与“克隆” /开发),但是它仍然很有用...
转载地址:http://eeogj.baihongyu.com/