在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 config变量可以修改行为git grep并避免传递几个命令行参数:
grep.lineNumber:始终显示匹配的行号(您可以传递-n给两者grep并git grep获得此行为)grep.extendedRegexp:始终使用扩展正则表达式(您可以传递-E给两者grep并git 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)
git grep仅搜索存储库中跟踪的文件。
grep您必须传递要搜索的文件列表,并且您必须自己过滤掉任何未跟踪的文件。
因此,如果您正在搜索已知存储库中的内容,则git grep可以节省您的时间,因为您所要做的就是提供模式。它对于不必搜索存储库中未跟踪的任何内容也很有用。