.gitattributes修改working-tree-encoding配置后检出文件的编码变化规则
Git .gitattributes修改后旧版本文件检出行为说明
核心逻辑:Git对文件的编码/格式处理分为提交入库和检出到工作区两个独立阶段,两个阶段的规则均基于操作时生效的.gitattributes配置,但仓库内部存储的内容由提交时的配置决定。
binary初始配置场景下的行为
- 初始配置为
*.abc binary时,binary是复合属性,等价于-text -diff -merge,代表Git会将.abc后缀文件识别为二进制文件:- 提交时不会做任何编码转换、换行符转换等文本类处理,直接把工作区文件的原始字节原封不动存入Git仓库,不存在「内部默认转UTF-8存储」的操作。
- 后续修改
.gitattributes为*.abc working-tree-encoding=IBM-1047 text后,该配置仅对修改配置后新产生的提交生效,对历史提交没有追溯效力:- 此时检出当初以
binary属性提交的123.abc文件时,Git会识别到该历史版本的文件是按二进制格式存入仓库的,不会尝试做任何编码转换,直接将仓库存储的原始字节输出到工作区。 - 不会出现你猜测的「将内部存储的UTF-8转换为IBM-1047」的情况,因为该历史版本入库时没有经过文本编码转换流程,仓库内存储的不是UTF-8格式内容。
- 此时检出当初以
补充说明
你提到的第一种场景(初始配置为*.abc working-tree-encoding=ISO8859-1 text)能正常转换编码,是因为当初提交时Git已经按文本规则,将工作区的ISO8859-1编码内容转换为UTF-8存入仓库,后续检出时就可以基于仓库内的UTF-8内容,按新配置转换为IBM-1047输出到工作区。
如果要让旧的历史提交也能按新的编码规则转换,你需要用git add --renormalize *.abc命令对历史文件做重新归一化处理,生成新的提交后才会生效。
内容的提问来源于stack exchange,提问作者GOVarney
相关产品推荐
相关产品推荐

