从远程 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 存储库获取单个文件的主要内容,如果未能解决你的问题,请参考以下文章