如果我们想在版本化的源代码中搜索,那么使用git grep比使用plain grep更好吗?

Jim*_*Jim 45 linux git grep

在git存储库中,使用git grep优质旧版本是否有任何差异/好处grep
一个例子是?

geo*_*ock 42

两者非常相似.主要区别在于git grep默认搜索git跟踪的文件.

例子

如果我想foo在我的项目中找到我可以使用git grep或好的独立grep:

git grep foo
grep -R foo .
Run Code Online (Sandbox Code Playgroud)

git grep版本仅搜索由git跟踪的文件,而该grep版本将搜索目录中的所有内容.到目前为止如此相似; 根据你想要达到的目标,任何一个都可以更好.

如果我们想将搜索限制为仅.rb文件怎么办?

git grep foo -- *.rb
grep -R --include=*.rb foo .
Run Code Online (Sandbox Code Playgroud)

普通的旧grep版本变得更加冗长,但如果您习惯使用grep它可能不是问题.他们仍然不会搜索完全相同的文件,但它又取决于你想要实现的目标.

在上一版本的项目中搜索怎么样?

git grep foo HEAD^
git checkout HEAD^; grep -R foo .; git checkout -
Run Code Online (Sandbox Code Playgroud)

这是哪里 git grep真正的区别:您可以在项目的另一个版本中搜索而不先检查它.这不是我经常出现的情况; 我通常想要搜索我检查过的项目版本.

配置git grep

有一些git config变量可以修改行为git grep并避免传递几个命令行参数:

  • grep.lineNumber:始终显示匹配的行号(您可以传递-n给两者grepgit grep获得此行为)
  • grep.extendedRegexp:始终使用扩展正则表达式(您可以传递-E给两者grepgit grep获得此行为)

在实践中

在实践中,我有gg别名git grep -En,这几乎总是做我想要的.


Alf*_*lfe 13

它的主要优点git grep是它可以在git存储库中找到模式,也可以在当前版本的源中找到其他模式.grep当然,使用标准无法做到这一点.此外,在git grep类似模式算法(类似的东西git grep -e pattern1 --and --not \( -e pattern2 -e pattern3 \)),使用glob的树搜索(git grep pattern -- '*.[ch]'仅搜索.c.h文件)等等中有更多功能.

这是一个用于搜索旧版本的示例会话:

$ mkdir git-test                 # create fresh repository
$ cd git-test/
$ git init .
Initialized empty Git repository in /home/alfe/git-test/.git/
$ echo eins zwei drei > bla      # create example file
$ git add bla                    # add and commit it
$ git commit bla
[master (root-commit) 7494515] .
 1 file changed, 1 insertion(+)
 create mode 100644 bla
$ echo vier fuenf sechs > bla    # perform a change on that file
$ git commit -m 'increase' bla   # commit it
[master 062488e] increase
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git grep eins | cat            # grep for outdated pattern in current version
                                  # (finds nothing)
$ git grep eins master^ | cat    # grep for outdated pattern on former version
                                  # finds it:
master^:bla:eins zwei drei
Run Code Online (Sandbox Code Playgroud)


Sch*_*eis 4

git grep仅搜索存储库中跟踪的文件。

grep您必须传递要搜索的文件列表,并且您必须自己过滤掉任何未跟踪的文件。

因此,如果您正在搜索已知存储库中的内容,则git grep可以节省您的时间,因为您所要做的就是提供模式。它对于不必搜索存储库中未跟踪的任何内容也很有用。