git - github:在下载(如 .zip 或 .tar.gz)中查找特定提交的哈希(标签)?
问题描述
场景:我有两个目录来自同一个 github 存储库,但在不同时间下载为 .zip(或者可能是 .tar.gz)。
问题:如何在这两个目录中找到提交哈希?它甚至存储在任何地方吗?
背景:我正在编写一些代码,走神了,我忘记了为什么我有两个不同的目录。目录明显不同(使用 diff -r dir1 dir2),不同之处不仅仅是我的小技巧。这些目录有一个文件 setup.cfg 都包含行版本 = 0.3.5,因此目录是相同的版本/“发布”但不同的提交哈希。我想知道提交哈希是什么。
解决方案
如果它已作为 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
例如(未经测试,您需要填写一些变量)。
推荐阅读
- html - 为什么网站在手机上放大(bulma)?
- mailchimp - 使用 MailChimp API v3 添加地址
- html - 为什么向我的图像添加属性链接会移动我的图像?
- c# - 2 不同组框中的单选按钮
- typescript - 在这种情况下,TypeScript 类型系统是否过于宽松?
- reactjs - 错误:在渲染时,Provider 的钩子调用无效
- java - Javassist - 向参数添加注释 [已解决]
- reactjs - 如何比较 React Hooks useEffect 上的 oldValues 和 newValues?多次重新渲染
- jupyter-notebook - Jupyter 笔记本正在加载,但在运行时没有任何反应
- python - Flask 应用程序未在 localhost 上运行,没有错误