关于搜索:如何grep Git提交某个单词的差异或内容?

How to grep Git commit diffs or contents for a certain word?

在Git代码存储库中,我想列出包含某个词的所有提交。我试过这个

1
git log -p | grep --context=4"word"

但它不一定会返回文件名(除非小于5与我搜索的单词背道而驰。我也尝试过

1
git grep"word"

但它只给我现在的文件,而不是历史。

如何搜索整个历史以便跟踪特定单词的更改?我的意思是搜索代码库中出现的单词以跟踪更改(在文件历史中搜索)。


如果要查找提交消息包含给定单词的所有提交,请使用

1
$ git log --grep=word

如果要查找在文件内容中添加或删除了"word"的所有提交(更确切地说,如果"word"的出现次数发生了更改),即搜索提交内容,请使用所谓的"pickaxe"搜索

1
$ git log -Sword

在现代Git中也有

1
$ git log -Gword

查找添加或删除的行与"word"(也提交内容)匹配的差异。

注意,默认情况下,-G接受regex,而-S接受字符串,但可以修改为使用--pickaxe-regex接受regex。

To illustrate the difference between -S --pickaxe-regex and -G, consider a commit with the following diff in the same file:

1
2
3
+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

While git log -G"regexec\(regexp" will show this commit, git log -S"regexec\(regexp" --pickaxe-regex will not (because the number of occurrences of that string did not change).


git log的鹤嘴锄会发现有一些变化,包括git log -Sword的"字"。


经过大量的实验,我可以推荐以下内容,其中显示了commits,它引入或删除包含给定regexp的行,并显示每个regexp中的文本更改,颜色显示添加和删除的单词。

1
git log --pickaxe-regex -p --color-words -S"<regexp to search for>"

不过,需要一段时间才能运行…;-)


另一种方法/语法是:git log -S"word"。这样,您可以搜索例如git log -S"with whitespaces and stuff @/#ü !"


您可以尝试以下命令:

1
git log --patch --color=always | less +/searching_string

或按以下方式使用grep

1
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

在要搜索的父目录中运行此命令。


VIM逃犯在VIM中用于这种检查是通用的。

:Ggrep来完成。有关更多信息,您可以安装VIM逃犯并通过:help Grep查找Turorial。这一集:探索-a-git-repository的历史将指导您完成所有这些工作。


要在正则表达式上使用布尔连接符,请执行以下操作:

1
git log --grep '[0-9]*\|[a-z]*'

此正则表达式在提交消息时搜索正则表达式[0-9]*或[A-Z]*


如果您希望搜索敏感数据以便将其从Git历史记录中删除(这就是我登陆这里的原因),可以使用一些工具来实现这一点。作为该问题的专用帮助页面。

本文的要点如下:

The BFG Repo-Cleaner is a faster, simpler alternative to git filter-branch for removing unwanted data. For example, to remove your file with sensitive data and leave your latest commit untouched), run:

1
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

To replace all text listed in passwords.txt wherever it can be found in your repository's history, run:

1
bfg --replace-text passwords.txt

See the BFG Repo-Cleaner's documentation for full usage and download instructions.