youzipi
4/8/2015 - 12:22 PM

git乱码解决方案汇总.txt

git乱码解决方案汇总 http://zengrong.net/post/1249.htm
本站原创文章,转载请注明: 转载自zrong's Blog,原文 git乱码解决方案汇总,欢迎使用文章源码进行转载。

本站转载文章会标明[转],转载请注明原始作者文章地址。


我一直是在cygwin下使用git,辅以TortoiseGit。使用上没什么问题,但今天在处理一个有中文文件名的项目时却出现文件名乱码的问题。
情况是这样的:

在一个使用cygwin的bash提交的git项目中,已经完成了所有的提交,但使用TortoiseGit查看的时候,却发现仍有文件没有提交,甚至是有文件还处于未暂存的状态。于是使用TortoiseGit提交;
再次用cygwin下的git status查看,这次又发现了未提交的情况。再次用git commit命令行提交;
回到TortoiseGit下查看,问题又出现了!此时准备返回两次提交前的版本,却因为文件名乱码的问题,无法返回了!
搜索一番,发现git文件名、log乱码,是普遍问题,这其中有编码的原因,也有跨平台的原因。因为git是从linux移植过来,默认采用UTF-8编码。而Windows默认使用UTF-16编码来保存文件名,应该就是这些不同的处理方式造成了乱码。下面是解决方案:


乱码情景1
在cygwin中,使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\273\223.png的乱码。

解决方案:

在bash提示符下输入:

git config –global core.quotepath false

ore.quotepath设为false的话,就不会对0×80以上的字符进行quote。中文显示正常。

乱码情景2
在MsysGit中,使用git log显示提交的中文log乱码。

解决方案:

设置git gui的界面编码

git config –global gui.encoding utf-8

设置 commit log 提交时使用 utf-8 编码,可避免服务器上乱码,同时与linix上的提交保持一致!

git config –global i18n.commitencoding utf-8

使得在 $ git log 时将 utf-8 编码转换成 gbk 编码,解决Msys bash中git log 乱码。

git config –global i18n.logoutputencoding gbk

使得 git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 /etc/profile 中添加:

export LESSCHARSET=utf-8

乱码情景3
在MsysGit自带的bash中,使用ls命令查看中文文件名乱码。cygwin没有这个问题。

解决方案:

使用ls –show-control-chars命令来强制使用控制台字符编码显示文件名,即可查看中文文件名。

为了方便使用,可以编辑/etc/git-completion.bash ,新增一行 alias ls=”ls –show-control-chars”

最终,还是没能解决最开始我提到的文件名提交乱码的问题。不过倒是有了一个新发现:使用git gui命令,在MsysGit下,看到的中文文件名为正常;而在cygwin下,看到的中文文件名为乱码。
同样的,如果一直使用TortoiseGit(实际调用MsysGit)提交,那么中文文件名没问题;一直使用cygwin提交,中文文件名也没问题。但一定不能交叉使用。这应该是两个平台默认处理中文文件名的方式不同造成的。

分别设置LANG、LC_CTYPE、LC_ALL参数为同样的编码,问题依旧。

cygwin官方网站提到了非拉丁语文件名的问题,也许研究后能解决该吧:Chapter 2. Setting Up Cygwin

这里还有一篇讲解Linux系统编码文章:locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别

貌似终极的解决办法是通过修改git和TortoiseGit源码实现的,有网友这么做了:让Windows下Git和TortoiseGit支持中文文件名/UTF-8

本文参考链接:

搞定Git中文乱码、用TortoiseMerge实现Diff/Merge
MsysGit乱码与跨平台版本管理
git中文文件名、目录名乱码应该怎么解决?