linux-如果我们要搜索版本化的源代码,使用git grep比普通grep更好吗?
在git存储库中,使用git grep与旧的grep有什么区别/好处?
一个例子是?
Jim asked 2020-07-24T13:55:13Z
5个解决方案
40 votes
两者非常相似。 主要区别在于git grep默认为在git跟踪的文件中搜索。
例子
如果要在我的项目中找到gg,可以使用git grep -En或较好的独立grep:
git grep foo
grep -R foo .
gg版本将仅搜索git跟踪的文件,而git grep -En版本将搜索目录中的所有内容。 到目前为止,差不多; 取决于您要实现的目标,哪一种可能会更好。
如果我们想将搜索限制为仅gg个文件怎么办?
git grep foo -- *.rb
grep -R --include=*.rb foo .
普通的gg旧版本变得有些罗word,但是如果您习惯使用git grep -En,则可能不会有问题。 他们仍然不会搜索完全相同的文件,但这又取决于您要实现的目标。
在项目的先前版本中搜索呢?
git grep foo HEAD^
git checkout HEAD^; grep -R foo .; git checkout -
这就是gg真正与众不同的地方:您可以搜索项目的另一个版本,而无需先检出它。 不过,这种情况对我而言并不常见。 我通常想搜索我已经签出的项目的版本。
配置git grep
有一些gg变量可以修改git grep -En的行为,并避免传递几个命令行参数:
gg:始终显示匹配的行号(您可以将git grep -En传递给grep和git grep以获得此行为)
gg:始终使用扩展的正则表达式(您可以将git grep -En传递给grep和git grep以获得此行为)
在实践中
在实践中,我将gg别名为git grep -En,这几乎总是可以满足我的要求。
georgebrock answered 2020-07-24T13:56:22Z
13 votes
git grep的主要优点是它可以在git存储库中找到模式。 e。 在当前版本的源代码之外的其他版本中也是如此。 当然,这不能使用标准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
Alfe answered 2020-07-24T13:56:47Z
2 votes
如果要在git存储库中(即已跟踪的文件中)搜索模式/字符串,那么可以,由于git grep被索引了,因此通常应该比常规grep快得多。 (您可以手动尝试,git-grep应该明显更快)
PlagueHammer answered 2020-07-24T13:57:10Z
1 votes
git grep仅在存储库中搜索跟踪的文件。
使用git grep,您必须传递文件列表以进行搜索,并且您自己会过滤掉所有未跟踪的文件。
因此,如果您正在搜索回购中已知的内容,则git grep可以节省您的时间,因为您只需提供模式即可。 这对于不必搜索存储库中未跟踪的任何内容也很有用。
Schleis answered 2020-07-24T13:57:39Z
0 votes
如果您在Git仓库中搜索,则--max-depth的速度更快。
在Git 2.20(2018年第四季度)上,它还与常规--max-depth更兼容(可选)。
如在--max-depth“愿望清单”中所讨论的:
我经常使用“ --max-depth”来递归grep源树。
如果花费的时间太长,我点击了--max-depth=0,并在命令行前面标记了“ --max-depth=-1”,然后重新运行它。
Git然后抱怨“ git grepr'" because "git grep`”是自然递归的。
我们可以让“ --max-depth”接受兼容性的论点吗?
其他重要的grep开关(如“ --max-depth=0”)是兼容的,添加--max-depth=-1将提高可用性。
现在(Git 2.20,Q4 2018)完成了:
参见RenéScharfe(--max-depth)的commit 0a09e5e(2018年10月1日)。
提出者:Junio C Hamano(--max-depth)。
(由Junio C Hamano合并---max-depth-在提交9822b8f中,2018年10月19日)
--max-depth:添加--max-depth=0
将--max-depth和--max-depth=0识别为--max-depth=-1的同义词,以与GNU grep兼容; 它仍然是git grep的默认设置。
这还会免费添加--max-depth作为--max-depth=0的同义词, 欢迎您提供完整性和一致性。
修正对--max-depth的描述时--1以外的负值实际上会禁用递归,即它们等效于--max-depth=0。
VonC answered 2020-07-24T13:59:05Z