首页 > 解决方案 > github:在下载(如 .zip 或 .tar.gz)中查找特定提交的哈希(标签)?

问题描述

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

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

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

标签: gitgithubhashcommitzipfile

解决方案


如果它已作为 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哈希,并且可以找到具有该树哈希的所有提交,那么所有这些提交都是生成该存档的提交。但git archive可能会在文件内容中省略、添加或替换。

找到一组文件的实际树哈希是非常重要的,尽管我有一个可以在这里完成的程序。通读源代码以了解它可以工作的条件。一旦你有了它,你可以搜索tree在他们的提交对象中包含它的提交,使用git rev-parse

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

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


推荐阅读