亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Git歷史記錄中實現GREP(搜索)提交的代碼?

如何在Git歷史記錄中實現GREP(搜索)提交的代碼?

Git
斯蒂芬大帝 2019-07-02 14:39:40
在過去的某個時候,我在文件中刪除了一個文件或一些代碼。我可以在內容中(而不是在提交消息中)實現grep嗎?一個非常糟糕的解決方案是grep日志:git log -p | grep <pattern>但是,這不會立即返回提交哈希。我到處玩git grep沒有結果。如何在Git歷史記錄中實現GREP(搜索)提交的代碼?
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

搜索提交含量(例如,實際的源代碼行,而不是提交消息等等),您需要這樣做:

git grep <regexp> $(git rev-list --all)

git rev-list --all | xargs git grep <expression>如果您遇到“參數列表太長”錯誤,將工作。

如果要將搜索限制在某個子樹(例如,“lib/util”),則需要將其傳遞給rev-list子命令和grep此外:

git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

這將使grep貫穿于您提交的所有文本中。regexp.

在這兩個命令中傳遞路徑的原因是rev-list的所有更改將返回修訂列表。lib/util發生了,但你也需要通過grep所以它只會搜索lib/util.

想象一下以下場景:grep可能會找到同樣的<regexp>返回的相同版本中包含的其他文件。rev-list(即使對該修訂本的檔案沒有任何改動)。

以下是搜索源的其他一些有用方法:

搜索文本匹配正則表達式regexp的工作樹:

git grep <regexp>

搜索工作樹,查找匹配正則表達式regexp1或regexp2的文本行:

git grep -e <regexp1> [--or] -e <regexp2>

搜索工作樹,查找匹配正則表達式regexp1和regpe 2的文本行,僅報告文件路徑:

git grep -e <regexp1> --and -e <regexp2>

搜索工作樹,查找具有文本匹配正則表達式regge 1和文本匹配正則表達式regbe 2行的文件:

git grep -l --all-match -e <regexp1> -e <regexp2>

搜索工作樹,查找更改的文本匹配模式行:

git diff --unified=0 | grep <pattern>

搜索所有修訂,以找到匹配正則表達式regexp的文本:

git grep <regexp> $(git rev-list --all)

搜索Rev1和Rev2之間的所有修訂,尋找匹配正則表達式regexp的文本:

git grep <regexp> $(git rev-list <rev1>..<rev2>)


查看完整回答
反對 回復 2019-07-02
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

您應該使用鎬(-S)任選git log

尋找Foo:

git log -SFoo -- path_containing_change 
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change

看見Git歷史記錄-按關鍵字查找丟失的行為了更多。


Jakub Nar?bski評論:

  • 這,這個查找引入或刪除<string>.
    它的意思通常是“用‘foo’添加或刪除行的修訂”。

  • 這個--pickaxe-regex選項允許您使用擴展的POSIX正則表達式,而不是搜索字符串。


羅布注釋,這個搜索是區分大小寫的-他打開了一個跟進問題如何搜索-不區分大小寫。


查看完整回答
反對 回復 2019-07-02
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

我最喜歡的方法是git log-G選項(添加在1.7.4版中)。

-G<regex>
       Look for differences whose added or removed line matches the given <regex>.

-G-S選項確定提交是否匹配:

  • 這個

    -S

    選項實質上計算在提交之前和之后搜索在文件中匹配的次數。如果前后計數不同,則提交將顯示在日志中。例如,這將不會顯示與搜索相匹配的行被移動的位置。
  • 帶著

    -G

    選項時,如果搜索與添加、刪除或更改的任何行匹配,則提交將顯示在日志中。

以這個提交為例:

diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello

由于文件中出現“hello”的次數與此提交之前和之后相同,因此它將不匹配-Shello..但是,由于對行匹配進行了更改hello,則將使用-Ghello.


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 1012 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號