今天我在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读取正确的文件名?
答案 0 :(得分:86)
在mac
上启用core.precomposeunicodegit config --global core.precomposeunicode true
为此,您需要至少拥有Git 1.8.2。
Mountain Lion以1.7.5发货。要获得更新的git,请使用git-osx-installer或homebrew(需要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 way。Git。 msysgit has had problems dealing with Unicode filenames依次显示非ASCII文件名字节的八进制转义形式。
请注意,Unicode文件名可以使您的存储库不可移植。例如,{{3}}。
答案 6 :(得分:0)
我的个人存储库遇到了类似的问题,所以我用Python 3编写了一个帮助脚本。你可以在这里写一下:https://github.com/sjtoik/umlaut-cleaner
脚本需要一些手工劳动,但不多。