免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5819 | 回复: 18
打印 上一主题 下一主题

[其他] msysgit在Windows下输入中文的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 21:06 |只看该作者 |倒序浏览
我安装的是最新版的msysgit(http://code.google.com/p/msysgit ... xe&can=2&q=),不过我也尝试了其它版本的msysgit,都不可以输入中文。在其帮助文档中说最新版的已经支持Unicode,可是却不能输入中文。
用以前的方法,即修改etc/input文件的方法也不行。
不知道各位高手有哪位知道msysgit输入中文的解决方法啊?

论坛徽章:
0
2 [报告]
发表于 2012-09-08 10:00 |只看该作者
没有人在Windows下用Git?

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
3 [报告]
发表于 2012-09-08 10:04 |只看该作者
windows下, GIT 适合单兵作战, 团队用的都是 SVN

论坛徽章:
0
4 [报告]
发表于 2012-09-08 10:11 |只看该作者
什么意思?在Windows下Git适合单兵,在Linux下Git就适合团体了?
为什么现在Git很火啊,好多SVN都转到Git下了
__BlueGuy__ 发表于 2012-09-08 10:04
windows下, GIT 适合单兵作战, 团队用的都是 SVN

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
5 [报告]
发表于 2012-09-08 10:14 |只看该作者
看样子你学习能力很强啊,

论坛徽章:
0
6 [报告]
发表于 2012-09-08 10:18 |只看该作者
以前用过SVN,但SVN几乎需要经常和服务器保持连接,而且速度好像有些慢。
__BlueGuy__ 发表于 2012-09-08 10:14
看样子你学习能力很强啊,

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2012-09-08 15:05 |只看该作者
不知道你说的"输入"具体是指什么。
所以先说我认为关于non-ascii文件名最要紧的问题:就是git仓库中的tree中记录的必须是utf8编码的文件名。

如果(无论通过什么方式)让git仓库中的tree是按utf8记录文件名的,就可以:
1. 处理那些cp936不能编码的文件名
2. 与非Windows的参与者协助
3. code hosting的view也能正确显示


检验tree的方式:

  1. mkdir 164
  2. cd 164
  3. git init

  4. echo -e '\xd3\xef' | xargs touch # 创建一个叫 "语" 的文件, 0xd3 0xef 是"语"按cp936编码的结果
  5. git add * # 这两步都避开了"输入"non-ascii的问题
  6. # 这只是为了测试时分离不相关的东西,比如终端是cmd还是emacs shell等。 实际工作时不会这么做。

  7. git commit -m init
  8. git cat-file -p HEAD
复制代码
如果输出的是

  1. tree 0c7867...
复制代码
那tree里面就是用cp936编码的。code hosting就会显示乱码,其他非Windows的用户checkout出来也是奇怪的文件名。
我这里还保留着的一个最老的版本,1.6.4就是这种情况。


git非官方修改版。
我之前是用的一个日本人做的改版。 http://tmurakam.org/git/
刚才上去看了看,已经提到了1.7.10开始官方支持了。 在http://tmurakam.org/git/old.html 依然可以下载到他提供的2个修改版。
用这两个版本执行上面的测试得到的结果就是

  1. tree 25eb7f...
复制代码
tree里面就是按utf8记录的文件名。
它做的工作就只是文件名的转换,其他都不管的。
比如git status(加上git config core.quotepath false)就会将utf8原样输出(这个修改版不会进行转换)。在cmd上就会显示乱码。

这个版本用了1年多了,没出过什么其他问题。



git官方支持:
我刚才把msys git 1.7.11下载并测试了一下。

echo -e '\xd3\xef' 之前就会显示"语"。
因为cmd需要接受cp936编码的byte流(中文Windows默认情况), 而这行命令就是将"语"的cp936编码结果写入cmd, 所以正确显示。

而1.7.11就会显示乱码。要 echo -e '\xe8\xaf\xad' # 这是"语"的utf8编码结果。 输出的就是语。
也就是说连echo命令现在都会进行 utf8 -> cp936 的转换。。。

上面的测试就这一条命令修改了, 最终结果也是

  1. tree 25eb7f...
复制代码
即tree里是按utf8记录文件名的。

但我不知道1.7.11还在哪些地方进行了编码转换。。。
比如git status也能显示出正确的名字了,肯定它也进行了utf8->cp936的转换。

我个人认为这样做并不科学。。。  应该像那个改版一样只负责将仓库正确就够了。 将它们正确显示出来是另一件事情。
但官方的方向貌似是要在cmd上解决这问题, 但cmd烂到不可能很好解决这个问题。
比如如果有cp936不能编码的文件名, git status应该还是会乱码。



最后,关于"输入"。 不知道LZ的意思是不是在cmd里直接输入?
因为我之前都用emacs shell的, 输入、显示都没问题(包括那些cp936无法编码的文件名、文件内容)。 缺点就是没有readline了。
所以一直没太关心这个问题。。。

总之,Windows各种搓。。。 cmd搓, 没有伪终端emacs的term也不能用。。。

论坛徽章:
0
8 [报告]
发表于 2012-09-08 21:41 |只看该作者
OwnWaterloo 发表于 2012-09-08 15:05
不知道你说的"输入"具体是指什么。
所以先说我认为关于non-ascii文件名最要紧的问题:就是git仓库中的tree ...


我说的输入中文指的是在提交时能够在GitBash中输入中文,或者找一个能够输入中文的GitBash替代目前使用的,
总之一句话,能够在提交时输入中文信息就行,现在这个GitBash根本就调不出输入法。
希望兄台能够帮助我

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
9 [报告]
发表于 2012-09-08 21:57 |只看该作者
你用 TortoiseGit-1.7.3.0-32bit.msi 了吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2012-09-08 22:49 |只看该作者
本帖最后由 OwnWaterloo 于 2012-09-08 23:01 编辑

回复 8# chinesedragon

联系到/etc/input。。。 我大概知道你指的什么了。。。

cmd.exe是可以调出输入法的。。。  切换输入法用的键和其他地方都是一样的。。。 下面会出现一个输入法名,随着输入的拼音还会出现候选项。
问题应该是被选的候选项不会插入到当前命令行中去。。。

这个问题不在cmd.exe本身。如果只是cmd.exe,无论是通过切换输入法输入,还是点击标题栏->编辑->粘贴,都是可以向当前命令行插入的。
阻止这个事的是msys的bash。 要用~/.inputrc进行配置。 /etc/input(rc)也许也行,没试。

  1. set convert-meta off
  2. set input-meta on
复制代码
这个方法在git 1.7.10之后又不行了。。。  原因可能就是前面那个回帖提到的。。。  git 在很多地方都进行了转换。。。
如果~/.inputrc没有那两行配置,问题和之前一样,那些字节会被阻止插入。
如果有那两行配置,就是1.7.10的新的问题了。。。  它会认为插入的是utf8编码的,然后自己转换为cp936。
问题是输入法或者标题->编辑->粘贴插入的都是cp936的。。。

例如,~/.inputrc里,如果只有set convert-meta off。那么echo 然后插入一个汉字"语"(无论是通过输入法还是粘贴)就会显示被插入的东西,是"\323\357"。
是2个字符,\323以及\357,不是8个\,3,2,3,\,3,5,7。这就是"语"按cp936编码的结果,是输入法(或者粘贴命令)提交给cmd.exe的。set convert-meta off就允许这2个字符插入到当前命令行。
但执行 echo \323\357 # 注意依然是2byte而不是8个ascii字符
就会产生乱码了,因为\323\357这2个byte被当作了utf8,进行了utf8->cp936的转换。

如果再在~/.inputrc里添加set input-meta on,在命令行里输入echo "语"时那两个字节就会进行utf8->cp936的转换。

如果能找到一个输入法(google拼音也许可以写这样的扩展),直接向当前命令行处插入utf8编码的字节,这问题应该就很清楚了。
又或者如果能设计出一段特殊的文本,将它们按cp936编码,然后按utf8解码也能得到一段有意义的文字也可以说明这个问题。



解决的方法:
0. 找一个可以插入utf8字节流的输入法。。。
1. 找git 1.7.10的新的文档,看能不能通过配置将一些转换关闭。
2. 用其他的终端软件,比如emacs shell,就可以控制提交给git时用的编码。不过这类软件的缺点是不能利用git提供的bash补全脚本了。
3. 不要用commit -m, 而是用外部编辑工具。。。 默认的vim(终端版的)应该也会有同样的问题, 可能只有外部的才行。。。
4. 找一个cmd.exe的替代品,isatty会返回true的那种, 同时又能很好处理unicode的 —— 不过我始终没找到。。。
5. 终极解决办法,一劳永逸的。。。 抛弃Windows。。。  至少部分抛弃。。。  cmd.exe始终是硬伤。。。
比如以Windows为主,但挂个虚拟机,mount到Windows的硬盘,然后在虚拟机里用git。。。
比如直接用Linux作主要开发环境。。。 对没有找到替代品的软件在虚拟机里(或wine)里用Windows的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP