git show --name-only输出特殊字符文件名转义异常解决方法
解决git show导出文件列表时特殊字符被转义的问题
直接通过Git原生参数输出原始文件名
Git默认开启core.quotepath配置,会对非ASCII字符、含特殊符号的文件名做八进制转义并包裹双引号,直接临时关闭该配置即可输出原始格式的文件名,替换原有命令为:
git -c core.quotepath=false show --pretty="" --name-only <commit_no> >> cpath.txt
参数说明:
-c core.quotepath=false:仅对本次执行的git命令生效,临时关闭路径转义规则,不会修改全局git配置- 输出的文件名为原始UTF-8编码,不会额外添加双引号,重音符号、中文等非ASCII字符会正常显示,可直接用于后续checkout操作
批量修正已导出的转义文件列表
如果已经生成了带转义内容的cpath.txt文件,可通过以下命令批量还原,无需手动逐行修改:
# 先备份原文件避免误改 cp cpath.txt cpath.txt.bak # 执行还原:去掉转义行的外层双引号,还原八进制转义序列为原始字符 python3 -c " lines = [] with open('cpath.txt', 'r', encoding='utf-8') as f: for line in f: line = line.rstrip('\n') if line.startswith('\"') and line.endswith('\"'): content = line[1:-1] raw = content.encode('utf-8').decode('unicode_escape').encode('latin1').decode('utf-8') lines.append(raw) else: lines.append(line) with open('cpath.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(lines) + '\n') "
更稳妥的批量checkout写法
如果不需要留存文件列表,直接批量checkout对应提交的文件,建议使用-z参数输出NUL分隔的文件列表,完全规避空格、换行、特殊字符导致的解析错误:
git -c core.quotepath=false show --pretty="" --name-only -z <commit_no> | xargs -0 git checkout <commit_no> --
如果需要留存文件列表,加-z参数导出的文件无任何转义,后续读取时按NUL符分割即可,不会出现路径匹配失败的问题。
内容的提问来源于stack exchange,提问作者vanessen
相关产品推荐
相关产品推荐

