rg 的 .gitignore 默认生效这点其实是一把双刃剑,值得单拎出来说。
你 clone 下来就能使是真的,但反过来想:哪天要找的东西恰好在 ignore 规则里,rg 会静默跳过,你只觉得「这仓库里明明有啊怎么搜不到」。比如被忽略的构建产物、本地配置、或者别人用 .git/info/exclude 排掉的临时文件,默认一个都扫不到。要找它们得加 -u(unrestricted,不去管 ignore 规则),连隐藏文件一起扫就 -uu。grep -r 反而没这层「聪明」,它真把所有文件都过一遍,包括 .git 目录,所以才慢。所以「该搜不该搜它门儿清」只在你认可 gitignore 口径时才成立。
顺便补一个容易被忽略的限制:rg 用的是 Rust 的 regex 引擎,快是快,但不支持 backreference(反向引用)和 lookaround(前后查找零宽断言)。其实想搜 (abc)\1 这种重复捕获、或者 (?<=foo)bar 这类,rg 直接报错或匹配不到。这种场景还得 grep -P(PCRE 模式)或 ugrep 顶上。日常代码跳转基本碰不到,但碰上就别死磕 rg 了。其实
rg --stats 能打出扫了多少文件、耗时几毫秒,想验证「秒回」可以多快自己看。简单说-j 调线程数也反直觉:机械盘上开太多线程,磁头寻道互相打架反而更慢。
你试过 ugrep 没?它内建了 PCRE 能力,还号称比 rg 快,算是把两边优点凑一块。我还没认真比过,你那几百万行的仓库要是愿意当回 benchmark 就太好了。