2012-06-17 153 views
18

我正在嘗試搜索與特定變量名有關的git歷史記錄中的更改。Git搜索所有差異

我試着這樣做:

git diff HEAD~25000 | grep -in mydistinctvariablename 

結果並沒有告訴我哪提交的結果線是從,它需要相當長的時間(約5-7分鐘)。

有沒有人有更好的解決方案,時間和結果明智嗎?

+2

可能重複[如何grep(搜索)的git歷史?](http://stackoverflow.com/questions/2928584/how-to-grep-search-the-git-history) –

+0

嗯沒有那些命令告訴我搜索結果來自哪個版本,只有 –

+0

中發生更改的文件對我來說,它是結果中文件名之前的SHA。我在第一個答案中使用了第一個命令。 [第二個答案](http://stackoverflow.com/a/2928721/211563)雖然你可能會找到更多的內容,並且這也給了SHA(提供你的日誌格式顯示它)。 –

回答

27

git log通常是檢查提交歷史記錄時使用的命令。 git log --grep可用於在提交消息中搜索正則表達式。

你是什麼後git log -S其搜索提交內容簡單或git log -G與正則表達式搜索它:

-S 查找以引進或刪除的實例的差異。請注意,這與簡單出現在diff輸出中的字符串不同。請參閱gitdiffcore(7)中的pickaxe條目瞭解更多詳情。

所以,舉例來說,在msysGit庫中我能找到的提交使用Tcl的介紹8.5.8兩種:

C:\src\msysgit\src>git log --oneline --grep "8\.5\.8" 
d938476 Make `NO_SFX=1 portable-release.sh` work 
ef1dc94 Update tk to version 8.5.8 
a910049 Update tcl to version 8.5.8 
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list 

剛剛在提交信息或尋找8.5.8你想做看,只有發生在致力於差異的字符串:

C:\src\msysgit\src>git log --oneline -S"version=8.5.8" 
7be8622 tcltk: update release.sh script for tcl/tk 8.5.9 
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list 

的範圍限制你有你的樣品中仍然可以在這裏用來限制要檢查的提交。仔細閱讀git log手冊,瞭解它可以做的所有事情。

注意-S只是看起來簡單的字符串差異 - 如果你真的想用類似的正則表達式,你例子,那麼你應該使用-G選項,而不是-S搜索的內容,但是這將是顯著慢。

+0

如果可以的話,在第一個代碼段中,d938476 Make''NO_SFX = 1 portable-release.sh \'work'這行是令人困惑的,因爲暗示第一個代碼段是第二個代碼段(換句話說,我認爲如果將這一行從樣本輸出中刪除會更清楚) – acdcjunior