在git中查找包含给定行(包含给定字符串)的文件版本的SHA1

在git中查找包含给定行(包含给定字符串)的文件版本的SHA1,git,Git,我正试图追踪一个测试人员使用valgrind报告给我的内存泄漏,valgrind报告内存泄漏,并对其分配时间进行跟踪。不幸的是,他们报告的文件自测试以来发生了重大变化。我想知道他们测试的是什么版本。为此,我想在linux/bash系统上,使用git查找文件在给定行号(来自valgrind报告)处具有给定函数调用的时间 换句话说,valgrind报告在回溯中有如下内容: function1 (file1.c:line1) function2 (file2.c:line2) 假设行号正

我正试图追踪一个测试人员使用valgrind报告给我的内存泄漏,valgrind报告内存泄漏,并对其分配时间进行跟踪。不幸的是,他们报告的文件自测试以来发生了重大变化。我想知道他们测试的是什么版本。为此,我想在linux/bash系统上,使用git查找文件在给定行号(来自valgrind报告)处具有给定函数调用的时间

换句话说,valgrind报告在回溯中有如下内容:

   function1 (file1.c:line1)
   function2 (file2.c:line2)
假设行号正确(即:函数没有包装在宏或内联中,这可能会混淆valgrind),我正在寻找file2.c的版本,其中line2包含字符串“function1”

我的尝试是首先使用“git log——follow file2.c | grep^commit”。作为快速测试,我收集了该输出:

commit f267c7671a8af8a4c97b5c4938bab3a7099d50ea
commit 3f45349afc39b5c3ed6a6517ee4a2008d21f9047
commit 09e489d88ecc9e0adee326d68f18834753ddbcdd
commit 14ae0ab236bea453a9e2af81b507fe8243813b34
commit e1c1b28671a5c957c77ce54a45ce7e1694a64592
commit 7a45c4761c7f0d2263934d254c50052941d0c9e7
commit db9e61c3253a8c6966ecf334ff9c394e17966188
...about a hundred SHA1 labels...
进入编辑器,并用以下内容搜索/替换每一行:

show f267c7671a8af8a4c97b5c4938bab3a7099d50ea:file2 | sed -n(line2)p
show 3f45349afc39b5c3ed6a6517ee4a2008d21f9047:file2 | sed -n(line2)p
show 09e489d88ecc9e0adee326d68f18834753ddbcdd:file2 | sed -n(line2)p
show 14ae0ab236bea453a9e2af81b507fe8243813b34:file2 | sed -n(line2)p
show e1c1b28671a5c957c77ce54a45ce7e1694a64592:file2 | sed -n(line2)p
show 7a45c4761c7f0d2263934d254c50052941d0c9e7:file2 | sed -n(line2)p
show db9e61c3253a8c6966ecf334ff9c394e17966188:file2 | sed -n(line2)p
...
但我没有找到匹配的。我做了更多的检查,确实找到了一个匹配的“一个”行号(我发现valgrind行号在我们的系统中通常是准确的,但可能是一个)

所以我的第一个问题是,“git日志”真的会显示该文件的所有版本吗?假设没有人在存储库中重写历史记录。我想知道我是否错过了这种方法的一个版本

我的第二个问题是,有没有一个好的方法来自动化这个?理想情况下,我正在考虑一个脚本,该脚本将采用文件名和行范围(lineA到lineC),并针对每个版本进行报告:

(shaX) lineA : contentsXA
(shaX) lineB : contentsXB
(shaX) lineC : contentsXC
(shaY) lineA : contentsYA
(shaY) lineB : contentsYB
(shaY) lineC : contentsYC
(shaZ) lineA : contentsZA
(shaZ) lineB : contenstZB
(shaZ) lineC : contentsZC

我可以为我正在寻找的字符串grep它的输出,并且我会看到包含该字符串的版本的SHA。或者有更好的方法来实现这一点吗?

使用git存储库并从
sha1\u文件.c
中选择
检查\u sha1\u签名
,作为一个具体示例,您可以看到定义该函数的行

git log --format=format:%H -- sha1_file.c | \
  xargs -I SHA1 env GIT_PAGER=cat \
  git grep --word-regexp --line-num check_sha1_signature SHA1 -- sha1_file.c
因为源文件的名称是在
git grep
命令中硬编码的,所以在重命名之后不会出现这种情况。

我没有使用“--format=format:%H”,这很有帮助。不幸的是,git报告:
错误:未知打开的'line num'
这是来自较新版本的git吗?我在Suse linux上使用1.7.3.4,在我的git版本中,我看到它是“-n”而不是“-line num”。打印出所有匹配的行,并显示行号可能比我想做的还要好(仅当它们匹配时才打印)。谢谢