为何git log -S仅对未加#注释的已提交代码行生效?
问题原因分析
核心原因:Shell变量解析干扰
你用双引号包裹搜索字符串时,shell会把$pageString当成环境变量展开。如果当前shell里没定义这个变量,它会被替换成空字符串,实际传给Git的搜索内容就变成了# = sortRollListings ——这种残缺的字符串自然找不到对应提交。
而你去掉#和空格后用git log -S"$pageString = sortRollListings $pageString"能得到结果,大概率是因为你当前shell的$pageString变量刚好等于代码里的实际值,巧合之下让展开后的字符串匹配到了原代码行。
次要可能:字符串格式不匹配
如果提交的diff里,注释行的格式和你搜索的不一致(比如#后面没有空格,或者空格数量不同),-S的精确匹配也会失效。比如实际注释行是#$pageString = sortRollListings $pageString(#和变量间无空格),但你搜的是带空格的版本,自然找不到。
解决方法
用单引号包裹搜索字符串,避免shell解析变量:
git log -S'# $pageString = sortRollListings $pageString'
或者用反斜杠转义$符号:
git log -S"# \$pageString = sortRollListings \$pageString"
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

