如何在Git仓库历史中搜索带引号的字符串?
在Git提交历史中搜索带引号的字符串
嘿,这个问题其实是shell的引号解析在搞鬼,拆解开就很好解决啦!
你平时用的git grep "some text here" $(git rev-list --all)能搞定普通字符串搜索,但当要搜的内容里带引号时,shell会先把引号当作语法符号解析,而不是把它作为搜索内容的一部分传给git grep。所以核心就是让shell把引号原封不动交给git grep,这里有几种常用的方法:
方法1:用单引号包裹带双引号的搜索内容
如果要搜的字符串是带双引号的,比如"fix login bug",直接用单引号把整个搜索串括起来就行——shell里单引号内部的所有字符都会被当作纯文本,不会解析:
git grep '"fix login bug"' $(git rev-list --all)
方法2:转义引号后用双引号包裹
要是你习惯用双引号,也可以用反斜杠\转义搜索内容里的引号,告诉shell这是普通字符:
git grep "\"fix login bug\"" $(git rev-list --all)
方法3:处理同时包含单双引号的复杂字符串
如果要搜的内容既有单引号又有双引号,比如"user's profile",可以用单引号拼接的方式(shell里单引号不能嵌套,所以要先关闭单引号,转义单引号,再重新打开单引号):
git grep '"user'\''s profile"' $(git rev-list --all)
或者用双引号包裹,里面的单引号不需要转义,写法更简洁:
git grep "\"user's profile\"" $(git rev-list --all)
额外小技巧:用-F选项避免正则干扰
如果你的搜索内容里还有正则特殊字符(比如.、*),可以加上-F选项(固定字符串匹配),这样git grep就不会把内容当作正则解析,匹配更准确:
git grep -F '"user's profile"' $(git rev-list --all)
内容的提问来源于stack exchange,提问作者Thomas Kessler
相关产品推荐
相关产品推荐

