我試圖追蹤由測試人員使用valgrind向我報告的內存泄漏,它在分配時報告內存泄漏和回溯。不幸的是,他們報告的文件自測試以來發生了顯着變化。我試圖找出他們測試的版本。要做到這一點,我想在文件在指定的行號(來自valgrind報告),在linux/bash系統上使用git進行給定的函數調用時查找。在git中查找包含給定字符串的文件版本中的SHA1
換句話說,在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。或者有更好的方法來解決這個問題嗎?
我還沒有使用「--format = format:%H」,這很有幫助。不幸的是,git報告: 'error:unknown open'line-num'' 這是來自較新版本的git嗎?我在Suse linux上使用1.7.3.4。 – PeterS6g
我在我的git版本中看到它是「-n」而不是「--line-num」。打印出所有的匹配行,並顯示行號可能比我試圖做的更好(只有匹配時纔打印它們)。謝謝! – PeterS6g
@ PeterS6g不客氣。我很高興它幫助! –