Git和Mac OS X上的Umlaut问题

时间:2011-04-07 13:27:59

标签: git macos versioning

今天我在Mac OS X上发现了Git的一个错误。

例如,我将在开头提交一个名为überschrift.txt的文件,其中包含德语特殊字符Ü。从命令git status我得到以下输出。

Users-iMac: user$ git status

On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   "U\314\210berschrift.txt"
nothing added to commit but untracked files present (use "git add" to track)

似乎Git 1.7.2在Mac OS X上遇到德语特殊字符的问题。 有没有解决方案让Git读取正确的文件名?

7 个答案:

答案 0 :(得分:86)

在mac

上启用core.precomposeunicode
git config --global core.precomposeunicode true

为此,您需要至少拥有Git 1.8.2。

Mountain Lion以1.7.5发货。要获得更新的git,请使用git-osx-installerhomebrew(需要Xcode)。

就是这样。

答案 1 :(得分:31)

原因是文件系统如何存储文件名的不同实现。

在Unicode中,Ü可以用两种方式表示,一种是由Ü单独表示,另一种是由U +“组合变音字符”。 Unicode字符串可以包含两种形式,但由于两者都令人困惑,因此文件系统通过将每个umlauted-U设置为Ü或U +“组合变音字符”来规范化unicode字符串。

Linux使用前一种方法,称为Normal-Form-Composed(或NFC),Mac OS X使用后一种方法,称为Normal-Form-Decomposed(NFD)。

显然Git不关心这一点,只是使用文件名的字节序列,这会导致你遇到的问题。

邮件列表线程 Git, Mac OS X and German special characters 中有一个补丁,以便Git在规范化后比较文件名。

答案 2 :(得分:7)

以下放入〜/ .gitconfig适用于10.12.1 Sierra的UTF-8名称:

precomposeunicode = true
quotepath = false

需要第一个选项,以便git'理解'UTF-8和第二个选项,以便它不会转义字符。

答案 3 :(得分:5)

要使git add file在Mac OS X上使用文件名中的变音符号,您可以使用iconv将文件路径字符串从组合转换为规范分解的UTF-8。

# test case

mkdir testproject
cd testproject

git --version    # git version 1.7.6.1
locale charmap   # UTF-8

git init
file=$'\303\234berschrift.txt'    # composed UTF-8 (Linux-compatible)
touch "$file"
echo 'Hello, world!' > "$file"

# convert composed into canonically decomposed UTF-8
# cf. http://codesnippets.joyent.com/posts/show/12251
# printf '%s' "$file" | iconv -f utf-8 -t utf-8-mac | LC_ALL=C vis -fotc 
#git add "$file"
git add "$(printf '%s' "$file" | iconv -f utf-8 -t utf-8-mac)"  

git commit -a -m 'This is my commit message!'
git show
git status
git ls-files '*'
git ls-files -z '*' | tr '\0' '\n'

touch $'caf\303\251 1' $'caf\303\251 2' $'caf\303\251 3'
git ls-files --other '*'
git ls-files -z --other '*' | tr '\0' '\n'

答案 4 :(得分:3)

将存储库的OSX特定core.precomposeunicode标志更改为true:

git config core.precomposeunicode.true

要确保新存储库获得该标志,请运行:

git config --global core.precomposeunicode true

以下是联机帮助页中的相关摘录:

  

此选项仅供Mac操作系统Git使用。什么时候   core.precomposeunicode = true,Git恢复unicode分解   文件名由Mac OS完成。这在共享存储库时很有用   在Mac OS和Linux或Windows之间。 (适用于Windows 1.7.10或更高版本的Git   需要,或者在cygwin 1.7下的Git。如果为false,则文件名为   处理完全透明的Git,向后兼容   旧版本的Git。

答案 5 :(得分:1)

这是对的。

您的文件名在UTF-8中,表示为LATIN CAPITAL LETTER U + COMBINING DIAERESIS(Unicode 0x0308,utf8 0xcc 0x88),而不是带有DIAERESIS的LATIN CAPITAL LETTER U(Unicode 0x00dc,utf8 0xc3 0x9c)。 Mac OS X HFS file system decomposes Unicode in a such wayGitmsysgit has had problems dealing with Unicode filenames依次显示非ASCII文件名字节的八进制转义形式。

请注意,Unicode文件名可以使您的存储库不可移植。例如,{{3}}。

答案 6 :(得分:0)

我的个人存储库遇到了类似的问题,所以我用Python 3编写了一个帮助脚本。你可以在这里写一下:https://github.com/sjtoik/umlaut-cleaner

脚本需要一些手工劳动,但不多。