从远程Git仓库获取单个文件

8

有没有一种方法可以在Java中以编程的方式从远程git存储库下载单个文件?

  1. 我希望使用尽可能少的带宽来解决此问题,最好只下载该单个文件。我不需要浏览存储库,我已经知道了文件的路径。
  2. 我希望找到一个不依赖其他应用程序的解决方案(例如,在计算机上安装另一个git客户端)。包含git客户端实现的Java库将是最理想的选择。

我曾经使用SVNKit完成了类似的操作,并且我看到了git的纯Java实现(eclipse's JGit),它也可能能够完成类似的操作,所以我希望有一个积极的答案;尽管我对git的工作方式有所了解 - 只允许从本地存储库更新 - 这可能会有问题。


据我所知,jgit仍在努力提供git的所有功能 - 它不太可能提供git没有的功能。 - Cascabel
我认为在一般情况下这是不可能的,也就是说,当你只能通过git协议进行访问时。我不相信普通的传输机制提供了任何访问单个文件的方式。我相当确定你必须在远程安装某些东西(例如gitweb),或者获得对存储库的文件系统访问权限(无论是远程还是本地,可能是浅克隆)。 - Cascabel
3个回答

10

git并不是专门为了从远程仓库获取单个文件而设计的,但你可以通过滥用git archive来实现。缺点是你需要下载一个“树”而不仅仅是你需要的blob。

例如:

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

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


2
请注意,对于 git:// 协议,你需要明确启用适当的服务以允许远程 git archive 访问。 - Jakub Narębski
path/to/dir 是什么? - Red Cricket

3
你对远程代码库有什么样的访问权限?是通过SSH,还是可以调用命令?如果可以的话,你只需调用git show HEAD:$path_to_file即可。
如果你不能在该机器上调用命令,也完全可以做到这一点,但你必须了解Git代码库的格式。(这比听起来要简单得多,因为它的设计非常简单。不像Subversion那样,代码库格式并不是作为一个黑盒子来使用的。)

如果您可以在远程上运行gitweb,也可以通过它来完成。 - Cascabel

0

引用 git-clone(1)

--depth depth

创建一个浅克隆,历史记录被截断到指定的修订版本数。浅存储库有许多限制(您无法从中克隆或提取,也无法从中推送或推入),但如果您只对具有悠久历史的大型项目的最近历史感兴趣,并且希望将修复作为补丁发送,则足够使用。

因此,粒度是目录,但可以限制修订历史记录。


2
你也可以使用 --no-checkout 来避免创建整个工作目录。不影响带宽,但可以节省大量文件创建时间。 - Cascabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接