【问题标题】:Git: Explore objects in a remoteGit:探索远程对象
【发布时间】:2017-07-17 06:23:12
【问题描述】:

我正在做一些 Git 的高级用法,查询对象以优化我的代码的测试运行,如果以下听起来与大多数人使用 Git 的用法相去甚远,请耐心等待。

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

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

有没有办法在不获取提交的情况下执行上述操作?

【问题讨论】:

    标签: git git-remote


    【解决方案1】:

    我假设您已经验证 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 了解如何获取它们的说明。

    【讨论】:

    • 谢谢,这可能行得通,但这意味着我现在必须添加查看 url 的逻辑,查看它是否是 ssh,如果使用 SSH 库访问服务器……那真是一团糟。我希望有更好的解决方案。
    • 是的,您必须自己进行编程,没有比git fetch 更低级别的命令可以指示获取单个提交。我不会说它是一团糟,只是编程。我将从system("scp...") 或任何您必须使用您选择的脚本语言调用系统命令开始,并且仅在由于子进程启动而导致性能不佳时才使用SSH 库。如果他们有 http 访问权限,那么答案相同,只是协议不同。
    猜你喜欢
    • 2010-12-10
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多