Git输出带ANSI控制字符导致xargs执行git add失败如何解决?
问题原因
Git 的颜色高亮逻辑默认会根据输出目标决定是否携带ANSI控制字符:输出到终端时开启颜色,输出到管道/文件时关闭颜色。你现在遇到的控制字符报错,是因为 Git 的 color.status 配置被修改为了 always,无论输出到什么目标都会强制携带颜色控制字符,这些字符会被 grep 当做普通文本传递给后续命令,最终导致 git add 识别的路径包含无效字符,匹配不到实际文件。
解决方法
你可以任选以下任意一种方案修复问题:
方案1:临时单次关闭颜色输出
直接给 git status 命令加参数强制关闭颜色,从根源避免生成多余控制字符,无需修改全局配置:git -c color.status=never status | grep 'Fml' | xargs -t -I {} git add -u "{}"方案2:修改全局配置恢复默认逻辑
执行一次全局配置,设置 Git 只有输出到终端时才开启颜色,后续所有管道类操作都不会再遇到同类问题:git config --global color.status auto配置完成后你原来的命令即可直接正常运行:
git status | grep Fml | xargs -t -I {} git add -u "{}"方案3:保留现有配置,过滤控制字符
如果不想修改颜色配置,可以在管道中加一步sed过滤掉所有ANSI颜色字符:git status | grep Fml | sed 's/\x1b\[[0-9;]*m//g' | xargs -t -I {} git add -u "{}"
补充说明:
git add -u仅会处理已经被Git追踪过的文件,如果你需要把Fml目录下的未追踪文件也纳入版本控制,可将命令中的-u参数替换为-A,或者直接使用更简洁的命令git add Fml/*实现需求,不需要通过管道过滤处理。
内容的提问来源于stack exchange,提问作者shawn
相关产品推荐
相关产品推荐

