从GitHub仓库下载单个文件夹或目录
我如何只从GitHub上托pipe的远程Git仓库下载特定的文件夹或目录?
说GitHub回购在这里的例子:
git@github.com:foobar/Test.git
其目录结构:
Test/ foo/ a.py b.py bar/ c.py d.py
我只想下载foo文件夹,而不是克隆整个Test项目。
2016年9月更新:社区创build了一些工具可以为您做到这一点:
-
GitZip (积分到Kino – upvote他的答案就在这里! )
-
DownGit (对Minhas Kamal的信贷 – upvote他的答案就在这里! )
Git不支持这个,但Github通过SVN。 如果你使用subversion检出你的代码,Github基本上会把git的repo转换成后台的subversion,然后提供请求的目录。
以下是如何使用此function下载特定的文件夹。 我将使用stream行的JavaScript库lodash
作为例子。
-
获取回购url 。 首先,将Github仓库的URL复制到剪贴板。
-
修改Subversion的URL 。 我想从
master
分支下载/docs
的文件夹,所以我会追加trunk/docs
。 完整的URL现在是https://github.com/lodash/lodash/trunk/docs
。 请参阅下面的注释,了解我们为什么必须使用此URL格式的更深入的解释。 -
下载文件夹 。 转到命令行并用SVN抓取文件夹。
svn checkout https://github.com/lodash/lodash/trunk/docs
你可能不会立即看到任何活动,因为Github需要花费30秒来转换更大的存储库,所以要耐心等待。
完整的url格式说明:
- 如果您对
master
分支感兴趣,请改用trunk
。 所以完整path是trunk/foldername
- 如果您对
foo
分支感兴趣,请改用branches/foo
。 完整path看起来像branches/foo/foldername
- Protip:如果你愿意,你可以在下载之前使用
svn ls
来查看可用的标签和分支
就这样! Github也支持更多的颠覆function ,包括支持提交和推送更改。
这个function的两个选项:
选项1:Chrome扩展程序
扩展名:github的GitZip
用法:
- 在任何GitHub公共回购页面。
- 只需双击你需要的项目。
- 点击右下angular的下载button。
- 查看进度仪表板并等待浏览器触发器下载。
- 获取ZIP文件。
获取令牌:
- 点击浏览器上的GitZip Extension图标。
- 点击“获取令牌”链接。
- 在Github授权页面授权GitZip权限。
- 回到开始的回购页面。
- 继续使用。
选项2:Github gh-page
http://kinolien.github.io/gitzip通过使用GitHub API和JSZip,FileSaver.js库。
第1步:inputgithub url到右上angular的字段。
第二步:直接按回车或点击下载下载zip,或点击search查看子文件夹和文件列表。
第三步:点击“下载压缩文件”或“获取文件”button获取文件。
在大多数情况下,它工作正常,除了该文件夹包含超过1,000个文件,因为Github Trees API的限制。 (指Github API#内容 )
如果您有GitHub帐户并使用本站的“获取令牌”链接,它也可以支持私人/公共回购和升级速率限制。
提示:令牌同步
如果你是一个gitip的页面用户,并且在网站上也有令牌; 现在,您可以安装github Chrome Extension的GitZip,并在安装后再次访问gh-page网站,它会自动同步令牌。
现在您可以直接下载或创build任何GitHub公共目录或DownGit文件下载链接!
我希望做类似的 – 我不仅要下载整个目录 ,还要创build一个直接的下载链接 。 但是,我发现什么都不能满足我的需要。 所以,我必须自己做 – DownGit 。
去DownGit ,input你的url,然后下载。 这是一个简单的演示 –
您也可以configuration下载文件的属性详细用法 。
如果你有svn
,你可以使用svn export
来做到这一点:
svn export https://github.com/foobar/Test.git/trunk/foo
注意URL格式:
- 基本的URL是
https://github.com/
-
/trunk
结尾附加
在运行svn export
之前,先用以下方法validation目录的内容:
svn ls https://github.com/foobar/Test.git/trunk/foo
对于一个通用的git回购:
如果你想下载文件,不要用历史logging克隆版本库,你可以用git-archive
来做到这一点。
git-archive
使git仓库的压缩zip或tar归档。 有些事情使它变得特别:
- 您可以select要归档的git存储库中的哪些文件或目录。
- 它不存档
.git/
文件夹,或它运行的存储库中的任何未跟踪的文件。 - 您可以归档特定的分支,标记或提交。 使用gitpipe理的项目经常使用它来生成项目版本(testing版,发行版,2.0等)的档案供用户下载。
从ssh连接到远程仓库创builddocs/usage
目录的档案的例子:
# in terminal $ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tgz
更多信息在这个博客文章和git文档 。
关于GitHub Repos的说明:
GitHub不允许使用git-archive
访问 。 ☹️
我创build了一个名为GitHubFolderDownloader的开源项目。 它使您可以下载存储库的单个文件夹,而无需克隆或下载整个存储库。
你不能; 与Subversion不同的是,每个子目录都可以单独检出,Git在整个存储库的基础上运行。
对于需要更细粒度访问的项目,可以使用子模块 – 每个子模块都是单独的Git项目,因此可以单独进行克隆。
可以想象,一个Git前端(例如GitHub的Web界面或gitweb)可以select为您提供一个接口来提取一个给定的文件夹,但据我所知,他们都没有这样做(虽然他们确实让你下载单个文件,所以如果该文件夹不包含太多的文件,那是一个选项)
编辑 – GitHub实际上提供了通过SVN访问,这将允许你做到这一点(根据评论)。 请参阅https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away了解如何执行此操作的最新说明;
其他的答案没有错,但我只是想我会分享第一次在这个过程中stream浪的人的分步说明。
如何从github存储库下载单个文件夹(Mac OS X):
〜打开terminal只需点击聚光灯,inputterminal,然后按回车
- 在Mac上,你可能已经有了SVN(testing只是打开terminal,input“svn”或“which svn” 〜没有引号)
- 在Github上:通过点击回购库中的特定文件夹名称,findGitHub文件夹path(而不是回购站点)
- 从浏览器的地址栏中复制path
- 打开terminal并input: svn export
- 接下来粘贴地址(例如): https : //github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
- replace词语: 树/主
- 用词: 树干
- 键入文件的目标文件夹(在本例中,我将目标文件夹存储在当前用户的Downloads文件夹内)
- 这里的空格只是空格而不是单词(空格)〜/ Downloads / HeadsUpUI
- 最终的terminal命令显示下载文件夹的完整命令(比较地址到步骤5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI〜/ Downloads / HeadsUpUI
顺便说一句 – 如果你在Windows或其他平台上,你可以在http://subversion.apache.orgfindsubversion(svn)的二进制下载;
〜如果你想结账的文件夹,而不是简单地下载它尝试使用svn的帮助(tldr:replace出口与结帐 )
1.点击这个链接http://kinolien.github.io/gitzip/
2.你要下载的Github文件夹的粘贴链接。
3.点击search它会显示所有文件下载。
注意: – 使用search没有必要input令牌密钥;)..保持简单(y)
如果你真的只是想“下载”文件夹,而不是“克隆” (用于开发),最简单的方法是简单地获取最新版本的存储库(以及其中的文件夹/文件)的副本 ,而不需要克隆整个回购,甚至首先安装git,就是通过在GitHub上转到所需的存储库/ fork / branch / commit来下载zip存档(用于任何回购,分支,分支,提交等) (例如http(s)://github.com/<user>/<repo>/commit/<Sha1>
获取特定提交后的文件副本),然后select右上angular附近的Downloads
button。
这个档案格式不包含任何git-repo的魔法,只是跟踪的文件本身(如果被跟踪的话可能还有一些.gitignore文件,但是你可以忽略这些:p) – 这意味着如果代码改变了,你想要留在上面,你将不得不手动重新下载它,这也意味着你将无法使用它作为一个混帐存储库…
不知道这是什么,你在这种情况下寻找(再次,“下载”/查看与“克隆”/开发),但它可以是有用的,但…
无论谁正在处理特定的文件夹,他需要克隆特定的文件夹本身,所以请按照以下步骤** —使用SPARSE CHECKOUT — **
第1步:创build一个目录。
第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
)
这是SVN比GIT更好的地方之一。
最后,我们已经吸引了三个select:
- 使用wget从github抓取数据(使用原始文件视图)
- 有上游项目发布所需的数据子集作为构build工件
- 放弃并使用全面结帐。 在第一个版本中,它受到很大打击,但是除非你获得了很多stream量,否则在下面的版本中没有太多的麻烦。
另一个具体例子:
就像我想从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
注意path中的树干
编辑:(根据Tommie C的评论)
是的,使用导出而不是结帐会给一个干净的副本,没有额外的git存储库文件。
svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo
编辑:如果树/主没有在url然后叉,它将在那里叉路url。
为了扩大上面的答案,从真正的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
有时一个具体的例子有助于澄清所提出的替代。
我们的团队编写了一个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
我使用的CentOS 7服务器上没有root访问权限,也没有git,svn等(也不想!),所以创build了一个python脚本来下载任何github文件夹: https : //github.com/andrrrl/github -folder-下载
用法很简单,只需从github项目复制相关部分,假设该项目是https://github.com/MaxCDN/php-maxcdn/ ,并且您想要一个文件夹只有一些源文件,那么您需要做一些事情:
$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(如果不存在,将创build目标文件夹)
它需要lxml库,可以用easy_install lxml
来安装
如果你没有root访问权限(像我一样),你可以创build一个.pydistutils.py
文件到你的$HOME
目录中,内容如下: [install] user=1
easy_install lxml
将会正常工作(ref: https:// stackoverflow .com / a / 33464597/591257 )。
如果您需要以编程方式执行,而您不想依赖SVN,则可以使用GitHub API以recursion方式下载所有内容。
为了获得灵感,这里是我的ruby的要点: https : //gist.github.com/cvengros/b2a7e82f66519d423b6f
你可以做一个简单的下载目录树:
git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -
但是如果你的意思是检查出来,并且能够做出承诺并推回来,那么你不能这样做。
如果你想下载的directoy是一个独立的库,最好创build一个其他的git仓库,然后使用git submodule函数。
当然,你必须成为你想要的初始回购的所有者
要从GitHub中导出目录,请将目录的URL中的“/ tree / master /”replace为“/ 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
我使用linux,把它放在〜/ .bashrc中,叫做even:D $ HOME / .bashrc
git-dowloadfolder(){ a="$1" svn checkout ${a/tree\/master/trunk} }
然后刷新shell
source ~/.bashrc
然后用它与git-downloadfolder blablabla:D