標籤:
git亂碼解決方案匯
- 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或者更高會出現編碼問題。
有兩篇文章介紹了這個問題的解決辦法:
- 升級到 msysgit 1.7.10 的檔名亂碼處理方式(需要FQ)
- upgrading to msysGit 1.7.10 (or higher)
下面的文章,是曆史遺留,可以不看。若希望知其所以然,則不妨觀之。
亂碼情景對號入座和解決方案亂碼情景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.GBKterminal -> set charactor encoding -> gbk
切換回linux預設
export LC_ALL=en_US.utf8; export LANG=en_US.utf8terminal -> set charactor encoding -> unicode(utf-8)
改變檔案名稱的編碼
如果已經造成亂碼的惡果,還可以在utf8和gbk之間切換檔案名稱。真的修改,而不是像上面那樣修改顯示的(解碼的)效果。
convmv <filename> -f utf8 -t gbk
例外:convmv在fat32的隨身碟上運行無效,估計是fat32不允許非法編碼。
本文參考連結
- 搞定Git中文亂碼、用TortoiseMerge實現Diff/Merge
- MsysGit亂碼與跨平台版本管理
- git中文檔案名稱、目錄名亂碼應該怎麼解決?
設 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。
參考連結:
1190000000578037
http://zengrong.net/post/1249.htm
【轉】git亂碼解決方案匯總