2012-11-04更新:官方的“終極”解決方案:msysGit1.7.10開始使用UTF-8編碼保存文件名。
2011-10-24更新: 從一篇鏈接到本篇文章的文章(我對這篇文章提出的與windows患者的相處之道深感贊同)找到了一個“終極”解決方案,但我沒有測試。
我一直是在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的話,就不會對0×80以上的字符進行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沒有這個問題。
解決方案:
使用 lls --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保持一致
1 2 |
export LC_ALL=zh_CN.GBK; export LANG=zh_CN.GBK terminal -> set charactor encoding -> gbk |
切換回linux默認
1 2 |
export LC_ALL=en_US.utf8; export LANG=en_US.utf8 terminal -> set charactor encoding -> unicode(utf-8) |
改變文件名的編碼
如果已經造成亂碼的惡果,還可以在utf8和gbk之間切換文件名。真的修改,而不是像上面那樣修改顯示的(解碼的)效果。
1 |
convmv <filename> -f utf8 -t gbk |
例外:convmv在fat32的U盤上運行無效,估計是fat32不允許非法編碼。