2017-02-26 92 views
6

我正在做一些Git的高级用法,为了优化我的代码的测试运行来查询对象,所以请耐心等待下面的声音与大多数人的用法相差甚远用Git做。Git:探索远程对象

我想做类似git cat-file -p [...]的东西,除了遥控器上的物体,不需要取物。即,我想说,“在远程origin上,显示我提交A,具体告诉我它的树的标识是什么;然后向我显示树的内容(blob和子树的列表)。”我不需要获取文件的实际内容,只是上面的信息。

我知道我可以从远程获取提交到我的本地仓库,并使用git cat-file,但它会涉及从远程获取提交的所有父母,这可能需要很长时间。我需要这个很快,因为它是在一个程序中完成的,该程序应该在许多不同的存储库上每天运行数百次。

有没有办法做到上述而不提取提交?

回答

1

我假定你已经验证git fetch --depth=...不能做你想做的。

如果你有ssh/scp访问远程,你可以简单地抓住indiviudal文件犯下(如果提交的哈希a1b2c3d4,它存储在文件里面objects/a1/b2c3d4)。将其放置在当地的.git/objects下相同的目录/名称下。然后照常使用当地git cat-file。从它的输出中,你可以解析树的散列,并从那里继续,取出单个的对象文件直到完成。 git cat-file不关心任何丢失的位,如果你有一个文件存在的散列,它会很高兴地输出它的内容。

为避免您的“真实”本地存储库出现问题,您可以在一个空的回收站中执行此操作,即使用git init tmprepos或其他任何方式创建的回收站。这并不会伤害到那里没有别的东西。

编辑:git存储包文件中的一些对象。请参阅https://git-scm.com/book/en/v1/Git-Internals-Transfer-Protocols以获取有关如何获取它们的说明。

+0

谢谢,这可能会工作,但这意味着我现在必须添加查看url的逻辑,看看它是否是ssh,如果使用SSH库访问服务器......这是一个大混乱。我希望有一个更好的解决方案。 –

+0

是的,你将不得不自己编程,没有比'git fetch'更低级别的命令,你可以指示你获取单独的提交。我不会把它称为一团糟,只是编程。我将从'system(“scp ...”)开始,或者以您选择的脚本语言调用系统命令的任何内容开始,并且如果由于子进程启动导致性能不佳,则只能使用SSH库。如果他们有http访问权限,那么它就是相同的答案,只是不同的protocoll。 – AnoE