【问题标题】:github: Find hash (tag) of a specific commit in a download (as .zip or .tar.gz)?github:在下载(如 .zip 或 .tar.gz)中查找特定提交的哈希(标签)?
【发布时间】:2021-11-11 22:18:39
【问题描述】:

场景:我有两个目录来自同一个 github 存储库,但在不同时间下载为 .zip(或者可能是 .tar.gz)。

问题:如何在这两个目录中找到提交哈希?它甚至存储在任何地方吗?

背景:我正在编写一些代码,被转移了,我忘记了为什么我有两个不同的目录。目录明显不同(使用 diff -r dir1 dir2),不同之处不仅仅是我的小技巧。这些目录有一个文件 setup.cfg 都包含行版本 = 0.3.5,因此目录是相同的版本/“发布”但不同的提交哈希。我想知道提交哈希是什么。

【问题讨论】:

    标签: git github hash commit zipfile


    【解决方案1】:

    如果它已作为 zip 或 tar 存档下载,则它不是提交,并且哈希 ID 很可能已经消失。我相信 GitHub 会将原始哈希 ID 粘贴到扩展标头中,因为他们使用 git archive 来做到这一点:

    在 [使用提交哈希 ID 构建存档的情况] ... 此外,如果使用 tar 格式,则提交 ID 存储在全局扩展 pax 标头中;它可以使用 git get-tar-commit-id 提取。在 ZIP 文件中,它被存储为文件注释。

    您将需要原始 tar 或 zip 文件来对此进行测试。如果未压缩:

    git get-tar-commit-id < archive
    

    如果它已经被压缩,请使用 zcat 或 gunzip 或任何适合您系统的方式解压缩:

    gunzip < foo.tar.gz | git get-tar-commit-id
    

    例如。

    如果您没有原始存档,或者它没有 ID,该怎么办?

    一般来说,从提取的源代码树到特定提交之间没有唯一的映射。从某种意义上说,这并不重要:如果您可以获得源树的 Git tree 哈希,并且可以找到 all 具有该树哈希的提交,那么所有这些提交中的提交是会生成该存档的提交。但git archive 可能会在文件内容中省略、添加或替换。

    找到某些文件集的实际树哈希并非易事,尽管我有一个程序可以做到这一点here。通读源代码以了解它可以工作的条件。一旦你有了它,你就可以使用git rev-parse在他们的提交对象中搜索将其作为tree的提交:

    git rev-list $start_points |
    while read $chash; do
        thash=$(git rev-parse $chash^{tree})
        [ $thash = $searchfor ] && echo "tree found in commit $chash"
    done
    

    例如(未经测试,您需要填写一些变量)。

    【讨论】:

    • 我按照上面的操作,使用具体的命令zcat file.tar.gz | git get-tar-commit-idunzip -z file.zipgithash.py somegithubdir取得了很好的效果。可以在答案中明确说明具体命令会很好。谢谢。
    • 我是为git get-tar-commit-id 部分做的,这并不复杂。 githash Python 技巧不适用于任何复杂的情况,因此确实需要用户方面的努力。 :-)
    猜你喜欢
    • 2012-08-26
    • 2012-11-18
    • 2016-06-25
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多