git grep 全字匹配_linux-如果我们要搜索版本化的源代码,使用git grep比普通grep更好吗?...

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值