如何在Git中使用git grep搜索包含">"字符的字符串?

9
git grep 看起来比常规的 GNU grep 有更简单的规则,这将允许您搜索制表符并使用反斜杠转义特殊字符。我正在尝试查找字符串->upload的出现次数,但似乎没有任何一种转义方式奏效。
如何运行git grep "->upload"
$ git grep ->upload
No output; return 0
$ git grep "->upload"
error: unknown switch `>'
git grep "\-\>upload"
No output; return error
$ git grep '->upload'
error: unknown switch `>'

在问题中包含错误消息会让人们直接跳转到问题(实际上与 > 无关)。尝试使用 git grep -upload 命令,你会看到一个非常相似的问题。 - Charles Duffy
1
再次重申:尝试使用git grep '-upload',不要加上>符号 -- 你仍然会收到“未知开关”的错误消息,只是另一个字符成为了最初失败的点。 >符号仅包含在消息中,因为它是在前导-之后第一个不被识别为有效选项的字符。 - Charles Duffy
1
顺便提一下,git grep "->upload"git grep '->upload'是完全相同的(同样适用于git grep -\>upload),以至于git无法区分它被称为其中哪一个;在这些情况下,传递给git的main()函数的C字符串列表完全相同。 - Charles Duffy
1
包括错误消息是很好的建议,而这正是 git 惨败的一个实例。在 2.14.1 版本中,这个特定的错误会生成 65 行错误消息,其中只有一行是有用的。如果您的终端显示屏少于 65 行,则该有用的错误消息已经滚动到了 tty 的顶部。以上。 - William Pursell
2个回答

14

当有疑问时,在正则表达式中使用单字符类而不是反斜杠来表示单个字符字面量:

git grep -e '-[>]upload'

虽然反斜杠的含义取决于具体字符和使用的正则表达式语法,但 [>] 的含义始终保持一致。

话虽如此,这里最紧迫的问题不是由 > 引起的,而是由前导短横线造成的,因为它使得该字符串与选项列表无法区分。

需要使用 -e 不是因为 >,而是因为 -。没有它,->upload 将被视为一系列标志 (->, -u, -p, -l, -o, -a, -d)。


即使没有 -e,您也可以将短横线移到字符类中,从而使其不再是命令行中的第一个字符:

git grep '[-][>]upload'

2
还要注意常见的解决方案:git grep -- -\>upload。使用两个连字符来表示选项结束是一种常见的习惯用法。 - William Pursell
@WilliamPursell。这真让人恼火,因为我已经知道了这一点(https://askubuntu.com/a/813432/652),但我却忘记了。 - TRiG
nod;在这种情况下,我更喜欢使用-e而不是--,因为它更明确和表达:它意味着下一个字符串是要匹配的模式,区别于例如文件名(在--之后合法的另一种数据)。 - Charles Duffy

10
git grep -F -- '->upload'

选项-F的意思是:使用固定字符串作为模式(不将模式解释为正则表达式)。

--用于将选项与参数分开,以避免将->解释为选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接