grep 在 git diff 中,但显示文件和行号

grep 在 git diff 中,但显示文件和行号

当我在分支上工作时,我想快速跳转到我的“TODO”评论。这意味着

  1. 我只想要添加到我的分支上的“TODO”注释(忽略 master 中的注释)
  2. 我希望每个匹配项都显示文件和行号。

我知道两个部分解决方案:git grep TODO具有正确的格式(将 grep.lineNumber 设置为 true),但结果太多。 git diff master... | grep TODO是一组很好的结果,但不显示文件和行号。

是否有一个选项可以告诉git diff每个更改的行添加文件名和行号前缀? (--line-prefix看起来很有希望,但似乎只需要一个固定的字符串。)

我可以通过吗--new-line-format=":%dn: %L"diff - 输出行号) 通过git diff


例如,目前我的搜索结果如下所示:

$ git diff master... | grep TODO
+    // TODO use a non-fatal assertion
+        // TODO use a non-fatal assertion
+// TODO make this conditional too

但理想情况下我想要这样:

src/foo/abc.cpp:221:+    // TODO use a non-fatal assertion
src/foo/xyz.cpp:934:+        // TODO use a non-fatal assertion
src/foo/util/extra.h:49:+// TODO make this conditional too

答案1

可以使用patchgit log的方式:

git log -p
# Hit '/' for search mode.
# Type TODO
# Then hit 'n' for next

要限制您的分支,您可以添加firstcommit...HEAD

答案2

我想做与 OP 完全相同的事情:查找在我的分支上添加的 TODO。

所以我整理了一个diff2vimgrep脚本。然后插上电源fzf.vim(vim 的模糊查找器):

command! -bang -nargs=0 RgDiffMaster call fzf#vim#grep("git diff master... | diff2vimgrep", 0, {}, <bang>0)

瞧: 演示

答案3

你几乎做对了。来自官方 git-grep 文档:

-h
-H
  By default, the command shows the filename for each match. -h option is used
  to suppress this output. -H is there for completeness and does not do
  anything except it overrides -h given earlier on the command line.

...

-n
--line-number
  Prefix the line number to matching lines.

这意味着以下命令

git grep -n TODO

应显示包含“TODO”的所有文件及其名称(默认行为)和匹配的行号(带有-n)。输出示例:

lib/my_script.py:67:    # TODO patch this
      ^          ^            ^
      |          |            |
  filepath    line number   matched line

如果匹配项太多,您可以使用从 grep 搜索中:^some_folder排除该文件夹(请参阅“示例”段落):some_folder

git grep -n TODO :^some_folder

或管道 shell 命令,如sedawk来过滤输出,仅查找您想要的文件或文件夹。

此外,您可以设置默认显示的行号(参见“配置”段落):

grep.lineNumber
  If set to true, enable -n option by default.

可以按照不同答案中的解释进行设置这个问题,例如:

git config --global grep.lineNumber true

相关内容