我正在对Git进行一些高级用法,查询对象以优化我的代码的测试运行,因此,如果以下内容听起来与大多数人对Git的用法相距甚远,请多多包涵。

我想对git cat-file -p [...]进行操作,但不对远程对象进行操作,而无需获取它们。即,我想说:“在远程origin上,向我展示commit A,具体告诉我它的树的ID是什么;然后向我展示树的内容(blob和子树的列表。)”我不需要仅获取上述信息,即可获取文件的实际内容。

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

有没有一种方法可以在不获取提交的情况下完成上述操作?

最佳答案

我假设您已经验证git fetch --depth=...不会执行您想要的操作。

如果您可以通过ssh/scp访问远程,则可以简单地获取该提交的单个文件(如果该提交为哈希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

关于Git:探索远程对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42472193/

10-14 16:03
查看更多