git log search




如何在存儲庫中搜索特定字符串的所有Git和Mercurial提交? (7)

不知道git,但是在Mercurial中,我只是將輸出的hg日誌輸出到某個sed / perl /腳本中,以搜索您要查找的任何內容。 如果您願意,您可以使用模板或樣式自定義hg日誌的輸出,以便於搜索。

這將包括回購協議中的所有命名分支。 Mercurial沒有像晃動blob afaik之類的東西。

我有一個Git倉庫,只有很少的分支和懸而未決的提交。 我想在存儲庫中搜索所有這樣的提交以獲取特定的字符串。

我知道如何獲得歷史記錄中的所有提交記錄,但這些記錄不包括分支或懸空斑點,只是HEAD的歷史記錄。 我想讓他們都找到,找到一個錯誤的具體提交。

我還想知道如何在Mercurial中執行此操作,因為我正在考慮切換。


任何以引用為參數的命令都會接受git rev-list手冊頁中記錄的--all選項,如下所示:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

因此,例如git log -Sstring --all將顯示提及string所有提交,並且可以從分支或標記訪問(我假設您的懸掛提交至少用標記命名)。


在git中有一個命令,我認為找到一個字符串要容易得多:

git log --pretty=oneline --grep "string to search"

在Git 2.0.4中工作


基於rq的答案,我發現這條線符合我的要求:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

它會報告提交ID,文件名,並顯示匹配的行,如下所示:

91ba969:testFile:this is a test

...有沒有人同意,這將是一個很好的選擇,包括在標準的git grep命令中?


為了添加更多尚未提及的解決方案,我不得不說,使用gitg的圖形搜索框對我來說是最簡單的解決方案。 它會選擇第一個匹配項,然後用Ctrl-G找到下一個匹配項。


用Mercurial你可以做一個

$ hg grep "search for this" [file...]

還有其他選項可縮小搜索的修訂範圍。


你可以看到懸掛git log -g提交。

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

所以你可以這樣做,在一個懸而未決的提交消息中找到一個特定的字符串:

git log -g --grep=search_for_this

或者,如果要搜索特定字符串的更改,可以使用鎬符搜索選項“-S”:

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

Git 1.7.4將添加-G選項 ,允許您傳遞-G <regexp>來查找何時移動了包含<regexp>的行,而-S不能這樣做。 -S只會告訴你什麼時候包含字符串的行總數發生了變化(即添加/刪除字符串)。

最後,你可以使用gitk來顯示懸掛的提交:

gitk --all $(git log -g --pretty=format:%h)

然後使用其搜索功能來查找錯位的文件。 所有這些工作假設缺少的提交沒有“過期”並被垃圾收集,如果它懸停30天並且過期reflog或運行一個過期的命令,可能會發生這種情況。





mercurial