什么原因会导致Git混淆字符编码?

27

编辑:git不会干扰字符编码。这里仍保留原文以分享知识和避免他人犯同样的错误。


背景:我的企业使用svn仓库,我使用git-svn作为客户端与该仓库交互。项目中的所有文本文件都(必须)使用Windows默认编码(cp-...)进行编码。我使用git-extensions和命令行来控制git。

我的操作:在过去的3天里,我一直在开发一个新功能,并进行了多次本地提交。最后,我使用交互式变基将所有这些提交压缩成一个提交,然后使用git svn dcommit命令将所有内容推送到svn仓库中。

问题产生:一个同事告诉我,我修改的文件以及我提交后的新文件中的所有重音符号都被弄乱了。我之前已经使用安装的git + svn提交包含重音符号的文本文件到相同的仓库中,并且这是我第一次遇到这个问题。

我的调查:我尝试了以下方法进行调查:使用notepad++打开文件,并尝试使用最常见的编码格式(包括Windows默认编码和UTF-8)查看它们:没有一种编码可以正确地显示重音符号,并且不同的重音符号总是用相同的奇怪字符序列呈现。

临时解决方法:我快速使用git extension创建了一个撤销提交,并将其“dcommited”了。

问题:我的企业svn仓库正常,但现在我需要解决以下两个问题:

  1. 理解发生了什么,导致有重音符号的字符被破坏了
  2. 从SVN历史记录中检索我的工作,并以正确的方式提交它(如果可能,而无需手动审查所有带重音符号的字符)

是否有人可以提供一些线索(我对git还比较新)?


1
你的意思是说你的文本文件内容被更改了,而不是路径吗?(我问这个问题是因为我知道git-svn处理文件的方式类似于字节数组)。你使用的git-svn版本是什么? - Dmitry Pavlenko
当git-svn向仓库提交更改时,会执行以下操作: - Dmitry Pavlenko
我迫不及待地想读你回答中“以下内容”的部分;=) - Samuel Rossille
1
抱歉,我误解了,这里只是评论区,我不知道。要么是交互式变基破坏了文件,要么是git-svn的问题。您可以通过创建一个临时分支(git co <commit-id>; git co -b tmpbranch)来检查,在执行交互式变基之前最新的提交,再在相同的情况下重新进行交互式变基。之后,请检查您的文件是否正常。请告诉我是git-svn还是变基的问题。 - Dmitry Pavlenko
3
Git在操作中不会销毁对象,它只是插入新的并更新引用。它仅在垃圾回收调用时才会销毁它们(虽然通常会隐式调用,但默认情况下不会修剪所有无法访问的对象)。 Git保留从引用和reflog访问的所有对象。但是,即使是无法访问的对象(默认情况下)也不会在约30天内被收集。只有在显式调用“git prune”或“git gc --prune”等命令时才会进行修剪。 - Dmitry Pavlenko
显示剩余3条评论
1个回答

32

现在让我们揭示痛苦的真相(对于我的自尊心而言是痛苦的,而不是对于git用户): 我弄乱了重音,而不是git。

我本可以删除那个问题,因为它让人错误地认为git会弄乱重音,但考虑到点赞数,我认为很多人都和我犯了同样的错误,所以我选择回答自己的问题来确立事实,并可能帮助处于同样情况下的人:

  1. Git不会触及除换行符以外的字符。
  2. 在提交之前我就弄乱了重音,但由于我没有注意到,所以没有发现。为了这么做,我使用Eclipse编辑了一些文件。Eclipse没有识别出编码,因此保存时所有重音都被奇怪的字节序列替换了。就是这样。

再次感谢Dmitry Pavlenko给我指导如何解决这个问题。

+1 到 "git reflog"

祝你修复重音愉快 ;=)


不幸的是,Eclipse在Linux和Windows上使用不同的编码默认值。仅仅这一点就给我带来了比其他任何问题都更多的麻烦。 - Rodrigo Coacci
我也因为Eclipse而来搜索这个问题。我想我的问题只是由于行结尾的改变,但我想确保这就是全部。感谢您的诚实和详细信息 :) - kwill

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