2010-09-04 107 views
5

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

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

我能够做到用SVNKit颠覆类似的东西,我已经看到有一个纯Java实现的Git(eclipse's JGit),这也许能够做同样的事情,所以我希望有一个积极的答案;但从我了解git的工作原理 - 只允许从本地存储库进行更新 - 这可能证明是有问题的。

+0

据我所知,jgit仍在努力提供git的所有功能 - 它不可能提供git不具备的功能。 – Cascabel 2010-09-04 13:28:40

+0

我不认为这在一般情况下是可能的,也就是说,您只能通过git协议访问。我不相信普通的传输机制提供任何方式来访问单个文件。我相当肯定你必须在远程(例如gitweb)上安装某些东西,或者通过文件系统访问一个repo(远程或本地的,可能是浅的克隆)。 – Cascabel 2010-09-04 13:33:20

回答

8

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

E.g.

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

作为替代方案,如果您有叫做gitweb设置上,你可以使用一个简单的卷曲或wget命令下载任何文件在其“原始”格式的远程仓库。

+0

这是一个真棒kludge。 – Cascabel 2010-09-04 14:11:42

+2

请注意,对于'git://'协议,我记得,明确地启用适当的服务来允许远程的'git archive'访问。 – 2010-09-06 19:34:12

+0

'path/to/dir'是什么? – 2014-02-19 23:31:51

0

答曰git-clone(1)

--depth深度

与截断到指定 号修订的历史 创建一个浅克隆。一个浅仓库有一个 限制的数量(你不能克隆或从中获取数据,也不能从 或 进入),但如果你只对一个历史悠久的大型项目的历史记录感兴趣, ,并且想要 发送修补程序作为修补程序。

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

+1

您也可以使用'--no-checkout'来避免创建整个工作目录。没有带宽效应,但节省了大量的文件创建。 – Cascabel 2010-09-04 13:29:31

3

对远程存储库有什么样的访问权限?它是通过SSH,你可以调用命令?如果是这样,你可以调用git show HEAD:$path_to_file

如果您无法在该机器上调用命令,仍然完全可以这样做,但您必须了解Git存储库格式。 (这比听起来更可怕,因为它的设计非常简单,与Subversion不同,存储库格式并不是一个黑匣子。)

+0

如果你可以在远程运行gitweb,你也可以通过它来完成。 – Cascabel 2010-09-04 13:22:24

相关问题