从远程 git 存储库获取单个文件

Posted

技术标签:

【中文标题】从远程 git 存储库获取单个文件【英文标题】:Get a single file from a remote git repository 【发布时间】:2011-04-08 05:08:57 【问题描述】:

有没有办法用 Java 以编程方式从远程 git 存储库下载单个文件?

    我更喜欢使用尽可能少的带宽的解决方案,最好只下载单个文件。我不需要浏览存储库,我已经有了文件的路径。 我更喜欢不依赖其他应用程序的解决方案(例如,在机器上安装另一个 git 客户端)。包含 git 客户端实现本身的 Java 库是最佳选择。

我能够使用 SVNKit 对 Subversion 做类似的事情,我已经看到有一个纯 Java 实现的 git (eclipse's JGit) 可能能够做类似的事情,所以我希望有一个积极的回答;尽管根据我对 git 工作原理的了解——只允许从本地存储库进行更新——这可能被证明是有问题的。

【问题讨论】:

据我了解,jgit 仍在努力提供 git 的所有功能 - 它不太可能提供 git 不提供的功能。 我认为这在一般情况下是不可能的,也就是说,你只能通过 git 协议访问。我不相信正常的传输机制提供任何访问单个文件的方法。我相当肯定你必须在远程(例如 gitweb)上安装一些东西或获得对 repo 的文件系统访问权限(远程或本地,可能是浅层克隆)。 【参考方案1】:

git 并不是真正为从远程存储库访问单个文件而设计的,但您可以为此滥用git archive。缺点是您必须下载“树”,而不仅仅是您需要的 blob。

例如

git archive --remote=url://to.git.repo branch path/to/dir | tar -x file

作为替代方案,如果您在远程存储库上设置了 gitweb,则可以使用简单的 curl 或 wget 命令以“原始”格式下载任何文件。

【讨论】:

请注意,对于git:// 协议,据我所知,您必须明确启用适当的服务以允许远程git archive 访问。 什么是path/to/dir【参考方案2】:

您对远程存储库拥有何种访问权限?是通过SSH,可以调用命令吗?如果是这样,您可以调用git show HEAD:<i>$path_to_file</i>

如果您无法在该机器上调用命令,仍然完全可以执行此操作,但您必须了解 Git 存储库格式。 (这并不像听起来那么可怕,因为它的设计非常简单。与 Subversion 不同,存储库格式不打算用作黑匣子。)

【讨论】:

如果你可以在远程运行 gitweb,你也可以通过它来完成。【参考方案3】:

Qgit-clone(1):

--深度深度

创建一个带有历史的浅克隆 截断到指定的 修订数量。浅层存储库有许多 限制(您不能克隆或从中获取,也不能从中推送 也不 进入它),但如果你只对 最近的 历史悠久的大型项目的历史,并希望 将修复作为补丁发送。

所以粒度是一个目录,但你可以限制修订历史。

【讨论】:

您也可以使用--no-checkout 来避免创建整个工作目录。没有带宽影响,但节省了大量的文件创建。

以上是关于从远程 git 存储库获取单个文件的主要内容,如果未能解决你的问题,请参考以下文章

从远程存储库快速“git clone”?

Git添加远程库和从远程库中获取(新手傻瓜式教学)

无需克隆即可从远程仓库获取最后一个 git 标签

未指定凭据从远程 Git 获取更改

如何将本地更改推送到 Bitbucket 上的远程 Git 存储库

如何仅删除远程存储库中的文件? [复制]