如何从托管在GitHub上的远程Git仓库中仅下载特定文件夹或目录?
例如,GitHub仓库地址如下:
git@github.com:foobar/Test.git
它的目录结构:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
我想只下载 foo 文件夹而不是克隆整个 Test 项目。
如何从托管在GitHub上的远程Git仓库中仅下载特定文件夹或目录?
例如,GitHub仓库地址如下:
git@github.com:foobar/Test.git
它的目录结构:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
我想只下载 foo 文件夹而不是克隆整个 Test 项目。
原始(手动)方法:git本身不支持直接检出单个目录,但是Github可以通过SVN来实现此功能。如果你使用Subversion检出代码,Github会在后台将存储库从git转换为subversion,然后提供所请求的目录。
下面是如何使用此功能下载特定文件夹的方法。我将以流行的JavaScript库lodash为例。
修改子版本的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 export
,因为我不想要一个Subversion的工作副本。然后我将导出的文件夹添加到Git中。(我的目录树中丢失了很大一部分,所以我从我派生的代码库中进行了导出。) - GraultImport
命令。我确定我提供了与答案中相似格式的正确URL。我甚至尝试使用可视化检查器并选择所需的文件夹(未键入URL),结果仍然相同。 - johnhttps://github.com/$organization/$repo/branches/$branch/$directory
。请注意,翻译时未进行任何改动,以保持原意。 - evaldeslacasarepo/branches/foo_branch/bar_folder
的方法,您将收到状态码410,表示该功能已被删除。 - Hugo您可以从DownGit直接下载或创建任何GitHub公共目录或文件的下载链接。
您还可以配置下载文件的属性-详细使用方法。
免责声明:我遇到了与提问者同样的问题,找不到简单的解决方法。所以,我首先为自己开发了这个工具,然后向所有人开放了它 :)
使用方法:
获取Token:
使用GitHub API和JSZip、FileSaver.js库,可以通过http://kinolien.github.io/gitzip进行下载ZIP文件。步骤1:在右上角的字段中输入GitHub URL。
步骤2:按下回车键或点击“下载”按钮可直接下载ZIP文件,或点击“搜索”按钮查看子文件夹和文件列表。
步骤3:单击“下载ZIP文件”或“获取文件”按钮即可获得文件。通常情况下,它能正常工作,但如果文件夹包含超过1,000个文件,则可能会出现问题,这是由于Github Trees API的限制所致。(请参考Github API#Contents)
如果您有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
.git
扩展名。您可以使用完整的项目链接,并以svn ls
开头,后跟项目的完整路径。例如:svn ls https://github.com/RobTillaart/Arduino.git
。要仅导出一个文件夹,只需添加/trunk
,然后是所需的路径,如svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib
。保持项目路径不变更会更容易。 - jgrochahttps://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi
中的内容,请运行 svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi
。一个名为 wsgi
的目录将被创建在当前工作目录下。只有源文件,没有其他东西。没有 .git
,也没有与Subversion相关的文件。 - Rockallite如果你想下载文件,而不是克隆具有历史记录的存储库,可以使用git-archive
命令完成。
git-archive
命令可以制作一个包含git存储库的压缩zip或tar档案。以下是一些使其特殊的功能:
.git/
文件夹,也不会归档运行该命令的存储库中的任何未跟踪文件。以下是从您连接到的远程repo中创建一个包含docs/usage
目录的档案的示例:
# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar
git archive --format tar
格式不是 tar.gz,而是 tar。 - DEWA Kazuyuki - 出羽和之| tar -x
来跳过创建 tar 文件。 - Guillermo在尝试了所有答案后,对我来说最好的解决方案是:
优点:
svn
或 API 令牌。.com
替换为 .dev
,以打开 GitHub 的内部编辑器中的 repo。浏览器
窗格中(左侧或按 Ctrl+Shift+E),右键单击所需的文件/文件夹并选择下载。选择文件夹
对话框中,选择您想要所选文件/文件夹存在于其中的磁盘目录。我尝试了其他解决方案,如接受的答案,但是:
svn
。其他答案没有问题,但我想分享一下第一次进行此过程的步骤说明。
~ 要打开终端,只需点击聚光灯并键入终端,然后按回车键
顺便说一句 - 如果您使用Windows或其他平台,您可以在http://subversion.apache.org找到subversion(svn)的二进制下载。
如果您想要检出文件夹而不仅仅是下载它,请尝试使用svn帮助(tl;dr:将export替换为checkout)。
更新
关于在下载/检出时恢复中断的评论。我建议尝试运行
svn cleanup
,然后再运行svn update
。请搜索SO以获取其他选项。
git clone --filter
只下载所需文件夹例如,要克隆此存储库子目录 small/
所需的对象:https://github.com/cirosantilli/test-git-partial-clone-big-small 特别是忽略包含大文件的子目录 big/
,可以执行以下操作:
git clone -n --depth=1 --filter=tree:0 \
https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git sparse-checkout set --no-cone small
git checkout
添加了--filter
选项以及对远程协议的更新,它确实阻止了从服务器下载对象。
我在这里更详细地介绍了:如何仅克隆Git存储库的子目录?
在2021年1月测试于git 2.30.0。
git checkout
,我的主要答案在:https://dev59.com/QHRB5IYBdhLWcg3wgXhV#52269934 中有正确的命令 git sparse-checkout set
。使用这个命令可以瞬间完成更新。已经更新。 - Ciro Santilli OurBigBook.com如果想要在特定文件夹工作,您需要克隆该特定文件夹本身,为此,请按照以下步骤使用稀疏检出。
创建一个目录。
初始化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
)