首页 文章

如何grep Git为某个单词提交差异或内容?

提问于
浏览
517

在Git代码库中,我想列出包含特定单词的所有提交 . 我试过这个

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

但它并不一定会给我回文件名(除非它比我搜索的单词少了5行 . 我也尝试过

git grep "word"

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

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

8 回答

  • 748

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

    $ git log --grep=word
    

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

    $ git log -Sword
    

    在现代的git中也有

    $ git log -Gword
    

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

    请注意, -G 默认接受正则表达式,而 -S 接受字符串,但可以使用 --pickaxe-regex 修改为接受正则表达式 .

    为了说明-S <regex> --pickaxe-regex和-G <regex>之间的区别,考虑在同一文件中使用以下diff进行提交:return!regexec(regexp,two-> ptr,1,&regmatch, 0);
    ...

    • hit =!regexec(regexp,mf2.ptr,1,&regmatch,0);
      而git log -G“regexec \(regexp”将显示此提交,git log -S“regexec \(regexp”--pickaxe-regex不会(因为该字符串的出现次数没有改变) .
  • 0

    git log 的镐将找到包含"word"和 git log -Sword 的更改提交

  • 2

    经过大量的实验,我可以推荐以下内容,它显示引入或删除包含给定正则表达式的行的提交,并显示每个中的文本更改,颜色显示添加和删除的单词 .

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

    需要一段时间才能运行... ;-)

  • 243

    还有一种方法/语法: git log -S "word"
    像这样你可以搜索例子 git log -S "with whitespaces and stuff @/#ü !"

  • 12

    您可以尝试以下命令:

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

    或以下列方式使用 grep

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

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

  • 7

    vim-fugitive用于Vim中的这种检查 .

    使用 :Ggrep 来做到这一点 . 有关更多信息,您可以安装vim-fugitive并通过 :help Grep 查找turorial . 而这一集:exploring-the-history-of-a-git-repository将指导你做所有这些 .

  • 2

    要在正则表达式上使用布尔连接器:

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

    此正则表达式在提交消息上搜索正则表达式[0-9] *或[a-z] * .

  • 6

    如果你想搜索敏感数据,以便从你的git历史中删除它(这就是我登陆这里的原因),有一些工具可以解决这个问题 . Github为a dedicated help page for that issue .

    这是文章的要点:

    BFG Repo-Cleaner是一种更快,更简单的git filter-branch替代方案,用于删除不需要的数据 . 例如,要删除包含敏感数据的文件并保持最新的提交不变,请运行:

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

    要替换在repository.txt中列出的所有文本,只要在存储库的历史记录中找到它,运行:

    bfg --replace-text passwords.txt
    

    有关完整用法和下载说明,请参阅BFG Repo-Cleaner的文档 .

相关问题