如何通过.gitattributes配置无扩展名文件的git diff转码与格式转换规则
无扩展名特殊编码文件的Git Diff配置方案
问题1:精准匹配单个无扩展名文件的解码规则
- 之前配置不生效的核心原因是
.gitattributes中的匹配规则错误:*model是通配符规则,会匹配所有文件名以model结尾的文件,无法精准匹配名为model的无扩展名文件 - 正确的匹配规则为直接填写完整文件名,在
.gitattributes中写入以下内容:
# 精准匹配名为model的无扩展名文件,使用utf16转换规则 model diff=utf16 # 精准匹配名为schema的无扩展名文件,使用JSON转换规则 schema diff=jsonutf16
- 验证规则是否生效:执行
git check-attr diff model,如果返回model: diff: utf16说明匹配成功。 - 对应的diff转换规则配置为:
[diff "utf16"] textconv = iconv -f utf-16 -t utf-8 [diff "jsonutf16"] # 先转UTF-8再格式化JSON,无jq工具可去掉| jq .部分 textconv = sh -c 'iconv -f utf-16 -t utf-8 "$0" | jq .'
问题2:无全局修改、协作者低门槛使用方案
Git出于安全限制,默认不会自动读取工作区根目录的配置文件,避免恶意仓库植入执行命令,所以无法做到零操作开箱即用,但是可以实现仅需单次执行命令、无需修改全局配置的效果:
- 将上面的diff转换规则保存到仓库根目录的
.gitconfig.repo文件中,随仓库一起提交 - 在仓库README中补充说明,协作者克隆仓库后,仅需要在仓库根目录执行一次以下命令即可:
git config --local include.path ../.gitconfig.repo
- 该命令只会修改当前仓库的本地配置,不会影响全局git配置,执行一次后永久生效
- 不需要额外编写bash脚本,所有规则都存在仓库内,协作者只需执行一行命令即可使用
生效验证
配置完成后执行git diff即可看到两个文件的文本差异,如果需要调试可以执行GIT_TRACE=1 git diff,正常会输出调用对应textconv转换命令的日志。
内容的提问来源于stack exchange,提问作者izzleee
相关产品推荐
相关产品推荐

