使用带负向预查的grep无匹配结果,SVN转Git脚本问题
解决grep负向预查无匹配结果的问题
你遇到的核心问题是:默认情况下grep不支持你使用的负向预查语法,因为这种语法属于Perl兼容正则表达式(PCRE)的特性,而grep默认启用的是基础正则表达式(BRE),无法识别它。下面给你几个实用的解决办法:
方法1:启用grep的PCRE模式(GNU grep适用)
如果你用的是Linux系统(默认是GNU grep),只需要给grep加上-P选项,就能开启Perl兼容正则模式,你的负向预查语法就能正常工作了:
git for-each-ref --format='%(refname:short)' --merged origin/trunk | grep -P '(?!origin/trunk)origin/.*'
注意:macOS默认用的是BSD grep,不支持-P选项,这种情况可以试试下面的方法。
方法2:拆分过滤逻辑(全平台通用)
不用依赖复杂的正则特性,我们可以拆分两步过滤:先筛选所有origin/开头的远程分支,再用-v选项反向排除origin/trunk。这种写法兼容性拉满,不管是GNU还是BSD grep都能正常运行:
git for-each-ref --format='%(refname:short)' --merged origin/trunk | grep 'origin/' | grep -v 'origin/trunk'
方法3:直接用git for-each-ref过滤(更高效简洁)
其实完全不需要额外调用grep,git for-each-ref本身就支持分支过滤。我们可以直接指定查询范围为远程分支,同时用--exclude排除origin/trunk,一步到位:
git for-each-ref --format='%(refname:short)' --merged origin/trunk --exclude='refs/remotes/origin/trunk' refs/remotes/origin/
最终整合命令
把过滤结果传给git branch -D --remote时,建议用xargs处理(避免分支名含特殊字符或多分支的问题),完整命令如下:
git for-each-ref --format='%(refname:short)' --merged origin/trunk --exclude='refs/remotes/origin/trunk' refs/remotes/origin/ | xargs git branch -D --remote
内容的提问来源于stack exchange,提问作者Daan Timmer
相关产品推荐
相关产品推荐

