Git v1.7.x 對中文檔名的處理已經沒問題

剛剛發現,在 commit 一個檔案時,那個檔案放在一個叫做「閱讀」的子目錄下,結果就無法 commit。無論使用 Git Bash、Git Gui、還是 TortoiseGit,都會出錯。

2013-04-01 更新:據說中文檔名的問題已經在 Git v1.7.10 之後獲得解決。我裝了 v1.8.1.2 之後,發現中文檔名都能正確處理,包括「許功蓋」等字。下圖是將我的 Windows 作業環境上的檔案推送至 Bitbucket 伺服器之後,在 Bitbucket 網頁上顯示的結果:


既然中文檔名已經沒有問題,以下內容就全過時了。免看!

作業系統:Windows 7
Git 版本:1.7.6-preview20110708
TortoiseGit 版本:1.5.6.0


TortoiseGit 的錯誤訊息是:

fatal: pathspec '?讀/1.txt" did not match any files

Git Gui 則是顯示「No changes to commit. No files were modified by this commit and it was not a merge commit.」

儘管相關的編碼參數都已經設定成 UTF-8,還是沒有用。事實上,這是因為「閱」這個字的內碼的第二個位元組是 0x5c,也就是反斜線字元('\')。其他像是「許」、「功」、「蓋」等,只要內碼有 0x5c 者,git 都無法正確處理。有個討論串就有提到這個問題:http://code.google.com/p/tortoisegit/issues/detail?id=194

令我好奇的是,為什麼當初這些檔案都可以 commit 至版本庫,現在卻不行了呢?試了一下,發現如果使用 Git Bash 來 commit 檔案,是可以成功的。我一開始都是用 Git Bash,後來為了操作方便,才改用 TortoiseGit,而 TortoiseGit 在 commit 時就會出現錯誤。

這倒不是說 Git 本身已經沒問題,請看下圖:


圖中欲送交的檔案路徑名稱是「閱讀\1.txt」,可是當 Git 看到閱讀的「閱」的第二個位元組是 0x5c ('\') 時,就把它當作反斜線字元來處理:反斜線常用來當作逸出字元,因此 Git 便自動多加了一個反斜線字元,變成 "\\"。圖中看到連續三個反斜線字元,就是這個原因造成的。

由此可見,就算 Git Bash 可以成功送交檔案,實際送進版本庫的檔案名稱也不會是正確的,那還不如像 TortoiseGit 那樣,送交的時候就出錯,至少不會 commit 錯誤的資料到版本庫而沒人發現。

網路上或可找到一些修補的解決方案,但我個人是傾向等到官方版本支援的時候才用中文檔名。

後續更新
  • 2012-04-04 : v1.7.9 Preview 的版本還是無法正確處理中文檔名。在安裝程式的 release notes 裡面有列出目前仍未解決的問題,其中一個就是檔案名稱:
    - git and bash have serious problems with non-ASCII file names (Issue 80, 159).

6 則留言:

  1. 大支豬與小蘋果2011/8/8 凌晨2:04

    幫您挑個錯字..
    TotoriseGit >> TortoiseGit

    回覆刪除
  2. Great! 多謝提供此訊息 :)

    回覆刪除
  3. 剛才去抓了新的版本(Git-1.7.11-preview20120710),改用了新的icon害我一時還找不到安裝檔
    (Release Notes有寫 Comes with the beautiful Git logo from http://git-scm.com/downloads/logos)。
    TortoiseGit 剛看是1.7.11.3 ,還有中文語系包可以裝。

    回覆刪除
  4. git config core.quotepath false

    請使用 msysgit >= 1.7.10

    回覆刪除

技術提供:Blogger.
回頂端⬆️