使用git提交UTF8 BOM更改

3

我不小心在Windows上提交了一个带有UTF8编码的文本文件,没有在提交之前删除BOM。现在我尝试在后续版本中删除它并再次提交此更改。看起来Git忽略了对BOM字节的更改。是否有一种设置可以让Git像原样检入文件?(我知道在处理行结尾时存在类似的问题-并且有一个相应的设置...)


3
git 不会改变 BOM 字符。你确定你删除的是你想要删除的字符吗?你是如何做到这一点的,而且为什么认为 git 忽略了这个改变? - CB Bailey
3个回答

3
如果您能重现这个问题,请务必报告一个缺陷。
以下是我的建议:
xxd -r > raw <<< "0000000: 4865 c582 c397 c3b8 0a                   He......."
cat raw # shows "Heł×ø" in UTF8 terminals

git init .
iconv -t UTF32BE raw  > test
git commit -am nobom test
iconv -t UTF32 raw  > test
git diff # reports: "Binary files a/test and b/test differ"
git commit -am bom test

验证不同的对象是否存在:

git rev-list --objects --all
1d0cf0c1871a8743f947bd4582198db4fc1e72b1
c52c2a8c211a0031e01eef5d5121d5d0b4aabc40
4740254f8f52094afc131040afc80bb68265e78c 
fd3c513224525b3ab94a2512cbbfa918793640eb test
2d9da153c5febf0425437395227381d3a4784154 
2e54d36463fee81e89423d7d80ccc5d7003aba21 test

或者,稍微更直接一些。
for h in $(git rev-list --all -- test); do git ls-tree $a; done
100644 blob 2e54d36463fee81e89423d7d80ccc5d7003aba21    test
100644 blob 2e54d36463fee81e89423d7d80ccc5d7003aba21    test

这是在64位Ubuntu上使用Git 1.7.4.1时的情况。


xxd test # no bom:
0000000: 0000 0048 0000 0065 0000 0142 0000 00d7  ...H...e...B....
0000010: 0000 00f8 0000 000a                      ........

xxd test # with bom
0000000: fffe 0000 4800 0000 6500 0000 4201 0000  ....H...e...B...
0000010: d700 0000 f800 0000 0a00 0000            ............


2
非常感谢您向我展示如何解决问题。实际上,git不会更改BOM字符。这是我在Windows机器上使用的编辑器出了问题。-- 谢谢! - Simon

2
Git不会忽略字节顺序标记(BOM)序列,因此可以仅提交删除BOM的更改。使用UTF-8格式的xml进行了测试。
在Visual Studio 2017中,在“文件”->“另存为”->“编码保存”->“Unicode(UTF-8无签名)”选项中删除Windows上的BOM。Git会检测到更改并可以提交。

-1
如果您找不到合适的解决方案,您可以在文件中添加一个字符,提交更改,删除BOM和该字符,然后修改提交记录。

2
什么?让我们首先确定问题是否存在。 - sehe
@sehe 您是正确的。使用git v1.7.4,我能够提交一个只去掉BOM的UTF-8编码文件。 - vhallac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接