大佬教程收集整理的这篇文章主要介绍了git ident ID -- 如何获取匹配文件的版本?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我设法将身份 ID 包含到构建中使用的每个源中。现在实际上尝试使用这些信息时,我必须发现,这些 ID 与我从 git log 中获得的信息没有任何共同之处。
我的问题是:
如何从一对 filename:ID 返回到 filename:commitID?
首先,让我引用the gitattributes documentation:
ident
当属性 ident
是
设置为路径,Git 将 blob 对象中的 $Id$
替换为
$Id:
,后跟 40 个字符的十六进制 blob 对象
名称,然后在结帐时跟一个美元符号 $
。任何
在工作树中以 $Id:
开头并以 $
结尾的字节序列
文件在签入时替换为 $Id$
。
因此,检出文件中的 ID 是 blob 哈希 ID,而不是 提交 哈希 ID。 blob 哈希 ID 特别(当前)是数据文件内容的 SHA-1 校验和,前面是文字文本 blob
、空格、以字节为单位的数据大小的 ASCII 格式表示,以及一个 NUL 字节 '\0'
。
(当然,这是包含 $Id$
的数据,而不是插入哈希 ID 的数据。因此,如果源文件由 $Id$\nhello\n
组成,其中 \n
代表换行符,我们要计算以下输出的 SHA-1:
printf 'blob 11\0$Id$\nhello\n'
因为 $Id$\nhello\n
是 11 个字节长。因此,此 blob 的哈希 ID 为 173cbef4e466bed5350cae075633cb81d1e01743
。)
不能保证这些是可逆的,因为您从二进制文件中获得的身份信息可能不足以识别一个特定的提交。对于经典示例,请考虑从单个 main.c
构建的程序:
#ident "$Id$"
但是 Makefile 本身有 -D
选项可以选择某些内容,而 main.c
有 #ifdef FEATURE1
等等。
Build #1 是用一个写着 -DFEATURE1
的 Makefile 制作的。 Build #2 是用没有这个 -D
的 Makefile 制作的。这两个不同的构建来自不同的提交,但它们对于文件 main.c
具有相同的 blob 哈希 ID,因此通过将编译的 main.o
ident 行与 libc 链接产生的两个不同的二进制文件具有相同的哈希。
最接近的是:
如果幸运的话,只有一个匹配的提交。
剩下的问题是如何做到以上几点。大概您将使用您已经使用的任何程序从二进制文件中提取身份信息,作为第一个要点。对于第二个和第三个,你必须写一个脚本。
脚本本身很短:您只需要查看每个可能的构建并提取相应的 blob 哈希值。因此,找到一个可能是构建的提交,然后使用 git ls-tree -r $commithash
从 git ls-tree -r
获取该提交的输出。 (在一次提交时运行一次 git ls-tree -r
以查看输出;注意每个 mode 100644
或 mode 100755
文件的 blob 哈希 ID。)
现在,将已知的目标文件“ident”与相应的源文件 blob 哈希 ID 进行匹配。如何进行此映射取决于您,并取决于您使用的工具和语言。如果所有已知的 ident 值都匹配所有正确的来源,则 $commithash
是候选哈希,因此打印它。
对所有候选提交重复此操作,您将在此处获得最佳答案。
(而且,正如您现在所看到的,ident
过滤器并不是很有用:最好使用 git describe
来获取可用标识并将其粘贴到构建输出中,在构建过程。)
以上是大佬教程为你收集整理的git ident ID -- 如何获取匹配文件的版本?全部内容,希望文章能够帮你解决git ident ID -- 如何获取匹配文件的版本?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。