每次我克隆/拉/取一个repo时,都会在xml文件的每一行之间添加中文文本。我已经尝试了我能想到的一切。
repo附带了它自己的gitattributes文件。文件是……
乱码文件的屏幕截图显示每隔一行都显示为中文和其他字符的序列。与预期文件内容的屏幕截图进行比较显示生成的文件没有意外字符 插入 ;相反,呈现了奇数字符序列 代替 原始文件中的相应行。
如果我们接受该文件以UTF-16编码,就像XML标题所说的那样,则有一个合理的解释:您正在使用Windows,以及您的有效价值 git 客户 core.autocrlf 财产是 true ,至少对那个文件。由此产生的自动行终止转换不会做正确的事情,因为它们不支持UTF-16。必须进行自动线路终端转换 残 ,至少对于受影响的文件。
git
core.autocrlf
true
当自动crlf转换处于活动状态且客户端在文件中看到UTF-16行终止符时,它正在克隆,无论是(逻辑)CR / LF序列还是裸LF,LF部分将被编码为 00 0A 。它需要作为一个裸LF,因为它预期的单字节编码CR / LF将是 0D 0A 。结果,客户端将这些序列转换为 00 0D 0A ,三个字节而不是两个。这将整个下一行从寄存器中抛出一个字节,但是当在下一行的末尾发生相同的事情时,它会将后续行推回寄存器。因此,在理解UTF-16的编辑器中查看时,您将看到正确和错误文本的交替行,就像在屏幕截图中一样。
00 0A
0D 0A
00 0D 0A
解决这个问题的最佳方法可能是通过确保git将其视为二进制而不是文本(为了git的目的而将其视为二进制文件)来使目标文件完全不符合行终止。在克隆存储库之前,您无法执行此操作,但您应该能够在之后进行修复。做这个:
编辑或创建 .gitattributes 将文件放在与麻烦的XML文件相同的目录中,在最后放置一行来取消设置XML的'text'属性:
.gitattributes
name-of-file.xml -text
强制目标文件从源存储库重新同步:
git rm --cached name-of-file.xml
git checkout HEAD -- name-of-file.xml
在那里或其他地方查找和删除任何作业可能是值得的 * 的 eol XML文件的属性也是。这些 不能 如果文件不被视为文本,则相关,但最好尽量减少受错误影响的表面区域。出于类似的原因,我建议删除XML文件的“text”属性的任何冲突规范。
eol
不要忘记提交新的/修改过的 .gitattributes 文件,至少是您的本地副本。
* “其他地方”在另一个地方意味着 .gitattributes 文件更接近树的根,或在 <repo_root>/.git/info/attributes 如果存在的话。
<repo_root>/.git/info/attributes