如果我们想在版本化的源代码中search,使用git grep比纯grep更好吗?

git仓库中,使用git grep优于旧的grep是否有任何区别/好处?
一个例子是?

Solutions Collecting From Web of "如果我们想在版本化的源代码中search,使用git grep比纯grep更好吗?"

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

例子

如果我想在我的项目中找到foo ,我可以使用git grep或者单机版grep

 git grep foo grep -R foo . 

git grep版本只会在git跟踪的文件中搜索,而grep版本将搜索目录中的所有内容。 迄今如此相似; 要么你可以更好地取决于你想达到什么目的。

如果我们只想将搜索范围限制为.rb文件呢?

 git grep foo -- *.rb grep -R --include=*.rb foo . 

普通的老grep版本越来越罗嗦了,但如果你习惯于使用grep ,这可能不成问题。 他们仍然不会搜索完全相同的文件,但这又取决于您想要达到的目标。

那么在项目的前一个版本中搜索呢?

 git grep foo HEAD^ git checkout HEAD^; grep -R foo .; git checkout - 

这是git grep真正改变的地方:你可以在项目的另一个版本中搜索,而不用先检查出来。 但这并不是我经常想到的情况, 我通常想在我检出的项目版本中搜索。

配置git grep

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

  • grep.lineNumber :总是显示匹配的行号(你可以传递-ngrepgit grep来获得这个行为)
  • grep.extendedRegexp :总是使用扩展正则表达式(您可以将-E传递给grepgit grep来获得这种行为)

在实践中

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

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 

如果你正在搜索git仓库中的模式/字符串(即在已经被跟踪的文件中),那么是的,git grep应该比普通的grep更快,因为它被编入索引。 (你可以手动尝试这个,git-grep应该明显更快)

git grep只在repo中跟踪的文件中搜索。

使用grep你必须传递文件列表来搜索,你可以自己过滤掉任何未跟踪的文件。

所以如果你正在寻找一些你知道的东西, git grep节省你的时间,因为你所要做的就是提供模式。 这也是有用的,不必搜索回购中未追踪的任何东西。