【转】git乱码解决方案汇总

git乱码解决方案汇



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

情况重现

  • 在一个使用cygwin的bash提交的git项目中,已经完成了所有的提交,但使用TortoiseGit查看的时候,却发现仍有文件没有提交,甚至是有文件还处于未暂存的状态。于是使用TortoiseGit提交;
  • 再次用cygwin下的git status查看,这次又发现了未提交的情况。再次用git commit命令行提交;
  • 回到TortoiseGit下查看,问题又出现了!此时准备返回两次提交前的版本,却因为文件名乱码的问题,无法返回了!

乱码原因

搜索一番,发现git文件名、log乱码,是普遍问题,这其中有编码的原因,也有跨平台的原因。主要原因是Windows 系统中的Git对中文文件名采用不同的编码保存所致。

Windows系统中使用的msysGit,采用的是系统编码来保存文件名;而Cygwin中的Git默认采用UTF-8编码来保存文件名。如果两个软件同时对一个版本库进行操作,且都认为对方是使用自己使用的编码来保存文件,就会导致文件名编码混乱,无法识别。

这就导致,如果一直使用TortoiseGit(实际调用MsysGit)提交,那么中文文件名没问题;一直使用cygwin提交,中文文件名也没问题。 但一定不能交叉使用。

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

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

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

官方终极解决方案

这个问题的官方终极解决方案,就是更新到msysGit1.7.10或更新版本。这个版本之后,msysGit和Git for Windows已经采用了UTF-8编码来保存文件名,不会再出现乱码的情况。安装和使用可参考这篇文章:使用Git、Git GUI和TortoiseGit

不幸的是,对于使用老版本msysGit提交的版本库,升级到msysGit1.7.10或者更高会出现编码问题。

有两篇文章介绍了这个问题的解决办法:



下面的文章,是历史遗留,可以不看。若希望知其所以然,则不妨观之。

乱码情景对号入座和解决方案

乱码情景1

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

解决方案:

在bash提示符下输入:

git config --global core.quotepath false

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

乱码情景2

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

解决方案:

设置git gui的界面编码

git config --global gui.encoding utf-8

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

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和TortoiseGit源码实现,有网友这么做了:让Windows下Git和TortoiseGit支持中文文件名/UTF-8 ,也可以直接访问这个开源的Google项目:utf8-git-on-windows 。

如果不抗拒命令行的话,直接用Cygwin来提交Git库。因为Cygwin其实是一个在Windows平台上的模拟器,它完全模拟GNU/Linux的方式运行,所以Cygwin中的Git是采用UTF-8编码来保存中文的。

又一个“终极”解决方案(来自(msysGit1.7.10之后,不再推荐此方案)

在操作git时,把区域设置修改为 中文GBK。这之后就可以进行git相关操作了。

在终端中跟windows保持一致

export LC_ALL=zh_CN.GBK; export LANG=zh_CN.GBK
terminal -> set charactor encoding -> gbk

切换回linux默认

export LC_ALL=en_US.utf8; export LANG=en_US.utf8
terminal -> set charactor encoding -> unicode(utf-8)

改变文件名的编码

如果已经造成乱码的恶果,还可以在utf8和gbk之间切换文件名。真的修改,而不是像上面那样修改显示的(解码的)效果。

convmv <filename> -f utf8 -t gbk

例外:convmv在fat32的U盘上运行无效,估计是fat32不允许非法编码。

本文参考链接

设 Git 安装目录为 C:\Git

1.使用 git add 命令添加文件名含中文字符的文件时

1.1 乱码类似:
    \316\304\261\276\316\304\265\265.txt
1.2 解决方案:

编辑 C:\Git\etc\inputrc 文件中对应的行,查找以下2行,并修改其值,
原先:


    set output-meta off
    set convert-meta on

改为:


    set output-meta on
    set convert-meta off

2.使用git log查看含有中文的log信息时

2.1 乱码类似:
    <E4><BF><AE><E6><94><B9><E6><96><87><E6><9C><AC><E6><96><87><E6><A1><A3>
2.2 解决方案:

在Bash提示符下输入:


    git config --global i18n.commitencoding utf-8
    git config --global i18n.logoutputencoding gbk

注:设置 commit 提交时使用 utf-8 编码,可避免 Linux 服务器上乱码;同时设置在执行 git log 时将 utf-8 编码转换成 gbk 编码,以解决乱码问题。
编辑 C:\Git\etc\profile 文件,添加如下一行:

    export LESSCHARSET=utf-8

注:以使git log可以正常显示中文(需要配合:i18n.logoutputencoding gbk

3.使用ls命令查看含有中文的文件名乱码时

3.1 乱码类似:

    ????.txt
    ???????.md
3.2 解决方案:

使用 ls --show-control-chars 命令来强制使用控制台字符编码显示文件名,即可查看中文文件名。
为了方便使用,可以编辑 C:\Git\etc\git-completion.bash 文件,添加如下一行:

    alias ls="ls --show-control-chars"

4.在Git Gui中查看UTF-8编码的文本文件时

4.1 乱码类似:
    锘夸腑鏂囨枃妗£
4.2 解决方案:

在Bash提示符下输入:

    git config --global gui.encoding utf-8

注:通过上述设置,UTF-8 编码的文本文件可以正常查看,但是 GBK 编码的文件将会乱码,所以还是没有从根本上解决问题。

可行的方法之一为:将所有文本文件的编码统一为 UTF-8 或 GBK,然后设置相应的gui.encoding 参数为 utf-8 或 gbk

参考链接:

https://segmentfault.com/a/1190000000578037

http://zengrong.net/post/1249.htm

时间: 2024-10-10 04:19:50

【转】git乱码解决方案汇总的相关文章

ajax乱码解决汇总

ajax乱码解决总结第一,javascript沿用java的字符处理方式,内部是使用unicode来处理所有字符的,第二,utf-8是每个汉字(unicode字符)用3个字节来存储.第三,用utf-8来send数据是不会出现乱码的,是后台程序没有正确解码才会出现乱码.第四,ajax发送数据的时候如果修改 Content-Type 为 application/x-www-form-urlencoded",肯定是用post方式,而“太大的数据往往会出错”是用GET方式发送数据造成的.第五,用vbsc

客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. 最后经过多次测试,现把解决方案分享给大家. 第一步:打开mysql中的配置文件,my.ini,看一看配置文件中 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 看是不是这样配置的.因为utf8 是国际通用的,

spring-websocket框架搭建遇到的问题解决方案汇总

问题1 org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server 严重: Servlet.service() for servlet [SpringMVC] in context with path [/ZHDM] threw exception [Request processing failed; nested exception is org.springfra

PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案

阐述 最近几天与公司的PHP开发人员测试即将上线的WEB站点(致难忘的青春岁月:http://hd.gfan.com),在内网测试环境没有任何问题,但在线上测试时,发现通过PHP的GD函数 imagefttext()引用FreeType字体将文本信息写入图像时,出现中文乱码:对此问题,我们在整个排查过程中,总结了三个能引起中文乱码的原因,如下: 1.Linux系统字符集是否支持中文? [email protected]:~#locale LANG=en_US.UTF-8 LANGUAGE=en_

Loadrunner11点击录制脚本无响应,IE页面弹不出——解决方案汇总

以前用Loadrunner的时候都没有遇到过这个问题,后来将服务器重装系统(win7)后,重新安装Loadrunner11,浏览器版本刚开始为IE11,后来降为IE8,IE访问部署在虚拟机里的平台能正常访问,但是用LR录制脚本时,点击录制脚本按钮之后,IE页面没有自动弹出,上网查找解决方案,本着死马当活马医的心态把查到的每一种方法都试了一下,最后IE页面弹出的那一瞬差点喊出来\(≧▽≦)/,现在把我的解决步骤作了总结. 录制环境:win7  64位操作系统  IE11(后卸载成IE8)   LR

jquery 或ajax返回的中文数据总是乱码解决方案

要将Servlet中的 response.setContentType("text/html;charset=utf-8")这行代码放在 PrintWriter out = response.getWriter()之前. jquery 或ajax返回的中文数据总是乱码解决方案,布布扣,bubuko.com

GET和POST提交乱码解决方案

写在开头: 一般说来在每个页面的开始处,都会加入: <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%> contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码, 当我们提交表单时浏览器会根据contentType对表单的内容进行

Intellij IDEA 各种乱码解决方案

一次解决所有问题,只需做配置文件的修改即可 解决方案: 在      IntelliJ IDEA 2016.1\bin\idea64.exe.vmoptions IntelliJ IDEA 2016.1\bin\idea.exe.vmoptions 都添加 -Duser.country=EN -Duser.language=us -Dfile.encoding=UTF-8 到此ok~! 以下是具体说明 IDEA有分很多种乱码,菜单栏乱码,console输出中文乱码,代码乱码等等,以下提供一些解决

MYSQL 命令行显示乱码 解决方案

中文乱码是因为编码集不支持,所以要改变编码 先查看下设置的编码 使用如下命令 show variables like 'character%'; 在 mysql.conf (Ubuntu mysql5.5)中的 [client]区域加上 default-character-set = utf8 在[mysqld]区域加上 character_set_server = utf8 重启服务 原文地址:MYSQL 命令行显示乱码 解决方案