MsysGit乱码与跨平台版本管理

老邓 2011-01-06 08:31:43
涉及两个问题:
1. 妥善解决MsysGit的中文乱码问题
2. 跨平台项目的版本库管理问题

网上提供了很多方便,但基本上都有一条:将日志强制使用GBK编码保存。
[i18n]
commitencoding = gbk

这样做的坏处是当提交到git项目托管网站时,由于网页默认使用的是utf-8编码,这会导致中文的commit log会乱码!
而且,由于在Unix下提交时,默认采用的是utf-8编码,这将导致有些log是GBK编码,有些log是utf-8编码,非常混乱。

经过一天的实践,总结出一种全新的方案,使用Windows、Unix及托管网站都可以完全的显示中文commit log.
原理:强制log统一使用utf-8编码。

1.在 etc\gitconfig 中添加:
[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = gbk

说明:
1) gui.encoding = utf-8 解决在 $ git gui 和 gitk 里中文乱码。
2) i18n.commitencoding = utf-8 设置 commit log 提交时使用 utf-8 编码,可避免服务器上乱码,同时与Unix上的提交保持一致!
3) i18n.logoutputencoding = gbk 使得在 $ git log 时将 utf-8 编码转换成 gbk 编码,解决 MSYS Bash 中 $ git log 乱码。

2.使得 $ git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 etc\profile 中添加:
  export LESSCHARSET=utf-8


网上流传的方法都没有使用logoutputencoding = gbk选项。
而我认为这才是最终解决中文commit log乱码的根本方案。

MsysGit的中文乱码,有两方面的原因:
1. MSYS Bash不支持utf-8编码的中文显示,而且没有自动将utf-8编码转换成gbk编码的选项。
2. Git GUI无法自动检测当前文件编码,导致只能由用户指定:encoding = utf-8 ,弊端是非utf-8编码的文本将显示乱码。

也鉴于这个原因,如果是开发跨平台项目,建议统一使用UTF-8编码,以尽可能的解决中文乱码问题。
...全文
1354 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
5257007 2011-06-29
  • 打赏
  • 举报
回复
我的git配置后,除了git status之外的命令,显示中文都没有问题。git status显示中文文件名字和目录名字都是乱码,谁遇到这种情况没有?多谢啊。
xunxun 2011-01-07
  • 打赏
  • 举报
回复
奇怪啊,有程序例子或者git例子么(例程可以Email我),我可以测试下,我暂时只是测试的cmd程序没有问题。
老邓 2011-01-07
  • 打赏
  • 举报
回复
而且cmd是自动将代码页改为936,在执行git diff之后。
所以才出来上面的乱码。
老邓 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xunxun1982 的回复:]

引用 5 楼 loaden 的回复:

照做后,在属性里看到代码页使用的已经是UTF-8了。
不过,中文仍然无法显示。
这回不是乱码,而是无法显示了。


字体改了么?不改字体就是无法显示
[/Quote]
改了,两种字体都试了。
我在cmd下做同样测试,则显示:
-    QString str("<E4><B8><96><E7><95><8C><EF><BC><8C><E4><BD><A0>ff<E5><A5><BD>
+ QString str("<E4><B8><96><E7><95><8C><EF><BC><8C><E4><BD><A0><E5><A5><BD>
xunxun 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loaden 的回复:]

照做后,在属性里看到代码页使用的已经是UTF-8了。
不过,中文仍然无法显示。
这回不是乱码,而是无法显示了。
[/Quote]

字体改了么?不改字体就是无法显示
老邓 2011-01-07
  • 打赏
  • 举报
回复
照做后,在属性里看到代码页使用的已经是UTF-8了。
不过,中文仍然无法显示。
这回不是乱码,而是无法显示了。
xunxun 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loaden 的回复:]

忘了我的问题:
请教如何在 MSYS 的 Bash 中将所有输出自动从 UTF-8 转换到GBK么?
[/Quote]
这个我不知能否做到,但是可以让bash正确显示UTF-8字符。因为msys的bash和windows的cmd相关的,也是内含了windows的代码页。他默认的代码页是GBK的。
在bash里输入

c:/windows/system32/chcp.com 65001

然后按Alt-space,选择属性,在字体栏里选择字体为非点阵字体(在我这里为Consolas和Lucida Console字体),然后在bash里输入utf-8输出的命令,你会发现就不会乱码了。缺点是gbk输出的就会乱码。
老邓 2011-01-07
  • 打赏
  • 举报
回复
忘了我的问题:
请教如何在 MSYS 的 Bash 中将所有输出自动从 UTF-8 转换到GBK么?
老邓 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xunxun1982 的回复:]

不知道Tortoise GIT GUI能否做到
[/Quote]
Tortoise GIT只能用于Windows平台,所以暂时没考虑它。
老邓 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xunxun1982 的回复:]

引用 17 楼 iambic 的回复:

在git有完善的windows支持之前(或者按Linus的说法“在windows”有完善的git支持之前),坚持hg。

Tortoise GIT还可以吧
[/Quote]
因为Unix下没有Tortoise Git,但有git gui,和Windows下是一样的。
为了保持同样的操作习惯,还是git gui吧。
或者git bash结合。

下午解决了在git bash下commit时编码问题,原因见 #20.
所以提交了一个bug :我觉得这个编码转换,应该由git 做。
http://code.google.com/p/msysgit/issues/detail?id=557
老邓 2011-01-07
  • 打赏
  • 举报
回复
HG被我无视了,主要是分支管理上不够强大。
另外,Git的性能是最好的: http://whygitisbetterthanx.com/

另外:
从MsysGit中提交的log采取GBK编码的原因是:COMMIT_EDITMSG的编码是GBK的。所以git config --global core.editor notepad2后,在编辑log后将其转换为UTF-8编码提交时可避免乱码。
1. 老邓: 这个乱码只针对git bash中提交时。git gui中肯定是自动转换编码了。
2. 老邓: 而在Windows平台下,QtCreator中的Git插件在提交log时,也没有做编码的转换,所以会将GBK的log当作UTF-8编码提交到版本库中。


xunxun 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 iambic 的回复:]

在git有完善的windows支持之前(或者按Linus的说法“在windows”有完善的git支持之前),坚持hg。
[/Quote]
Tortoise GIT还可以吧
yutaooo 2011-01-07
  • 打赏
  • 举报
回复

强大的分支管理
iambic 2011-01-07
  • 打赏
  • 举报
回复
在git有完善的windows支持之前(或者按Linus的说法“在windows”有完善的git支持之前),坚持hg。
老邓 2011-01-07
  • 打赏
  • 举报
回复
有需要的,自己看着改改,放到bin目录执行一下就搞定了。
正好从网上打印的progit中文版也到手了,越研究progit,直感叹相见恨晚!
强大的分支管理,爽的不得了。
老邓 2011-01-07
  • 打赏
  • 举报
回复
写了一个脚本,用于自动完成所有设置!
#!/bin/sh

# MsysGit 中文支持
cat >> /etc/gitconfig << END
[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = gbk
END
cat >> /etc/profile << END
export LESSCHARSET=utf-8
END

# 全局配置
git config --global user.name "qpsoft"
git config --global user.email "support@qpsoft.com"

# 取消 $ git gui 的中文界面,改用英文界面更易懂
if [ -f "/share/git-gui/lib/msgs/zh_cn.msg" ]; then
rm /share/git-gui/lib/msgs/zh_cn.msg
fi
老邓 2011-01-07
  • 打赏
  • 举报
回复
有的工程会只面向中文环境,所以源码中有中文是无法避免的。
再次整理了一下:
【中文支持】
1.在 etc\gitconfig 中添加:
[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = gbk
说明:
1) gui.encoding = utf-8 解决在 $ git gui 和 gitk 里中文乱码。
2) i18n.commitencoding = utf-8 设置 commit log 提交时使用 utf-8 编码,可避免服务器上乱码,同时与Unix上的提交保持一致!
3) i18n.logoutputencoding = gbk 使得在 $ git log 时将 utf-8 编码转换成 gbk 编码,解决 MSYS Bash 中 $ git log 乱码。

2.使得 $ git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 etc\profile 中添加:
export LESSCHARSET=utf-8

【全局配置】
1.添加全局用户名及邮件
$ git config --global user.name "用户名"
$ git config --global user.email "邮件地址"

2.取消 $ git gui 的中文界面,改用英文界面更易懂
$ rm /share/git-gui/lib/msgs/zh_cn.msg

【注意事项】
1.$ git checkout 有时候需要修改/增删很多文件,如果某些文件被占用,会被 Windows 拒绝,导致失败,甚至可能造成版本库出现无法修复的问题。这是由文件系统决定的,只能尽量避免 checkout,实在需要的时候先注销一次,就不会有问题了。
2.Git目前不支持中文文件名的文档,切记!!
3.提交时切记只在 $ git gui 中操作:它可以保证提交的 log 是按 i18n.commitencoding 的设定来编码的。
xunxun 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 loaden 的回复:]

引用 11 楼 xunxun1982 的回复:

这个做法和我的差不多吧。
我没建立Qt工程,是使用的utf-8的c语言源码输出中文字符。
按照我的设置,是能够正确显示的。

嗯,你是在msys下写的C程序输出中文吧。
我也没用Qt,我是用的git版本管理:然后尝试中文的commit log,以及中文的git diff.

经过Windows/Unix两个平台的反复测试,以及与……
[/Quote]
这个是的,中文系统控制台输出中文得使用gbk编码,你说的commit log我没试过中文在控制台输出。反正和控制台有关的,我一律使用英文了,省得麻烦。
老邓 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xunxun1982 的回复:]

这个做法和我的差不多吧。
我没建立Qt工程,是使用的utf-8的c语言源码输出中文字符。
按照我的设置,是能够正确显示的。
[/Quote]
嗯,你是在msys下写的C程序输出中文吧。
我也没用Qt,我是用的git版本管理:然后尝试中文的commit log,以及中文的git diff.

经过Windows/Unix两个平台的反复测试,以及与gitorious.org托管平台的网页commit log显示测试,发现所有编码都使用utf-8是最适合跨平台开发的!也最适合git的跨平台管理。
xunxun 2011-01-07
  • 打赏
  • 举报
回复
这个做法和我的差不多吧。
我没建立Qt工程,是使用的utf-8的c语言源码输出中文字符。
按照我的设置,是能够正确显示的。
加载更多回复(2)

24,862

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧