Git和Mac OS X上的Umlaut问题

Luc*_*aka 68 versioning git macos

今天我在Mac OS X上发现了Git的一个bug.

例如,我将在开头提交一个名为ü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)
Run Code Online (Sandbox Code Playgroud)

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

chi*_*ken 87

在mac上启用core.precomposeunicode

git config --global core.precomposeunicode true
Run Code Online (Sandbox Code Playgroud)

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

山狮以1.7.5发货.要获得更新的git,请使用git-osx-installerhomebrew(需要Xcode).

而已.

  • 奇怪的是,对我来说_opposite_工作(`git config --global core.precomposeunicode false`).我正在运行OS X 10.9.2和Git 1.8.5.2,文件存储在带有HFS +文件系统的磁盘映像上.可能是Apple改变了他们的实施吗? (24认同)
  • 不幸的是,在OS X 10.9.1和Git 1.8.5.2下无效. (2认同)
  • 我必须在OS X 10.10和Git 2.0.0上将配置参数设置为`false`.我没有必要再次克隆或结账.它刚刚起作用. (2认同)
  • 对我来说,将其设置为true(默认情况下在Git 2.2.0/Mac OS X 10.9.5上)错误地显示5个文件,其中包含不常见的未命名名称.图4显示为用双引号括起来.如果我将其设置为false,则会跟踪其中4个,但没有双引号的那个仍未跟踪.4可能有韩文字符,而第五个有变音符号.有任何想法吗? (2认同)
  • 这对我有用,尽管只是省略了--global之后。 (2认同)

Yuj*_*uji 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和德语特殊字符都有一个补丁,以便Git在规范化后比较文件名.

  • 变音归一化是一个巨大的错误.文件系统不应该以某种方式构建,因此运行在顶部的东西必须"关心"发生的奇怪修改.Ken Thompson会说这不是一个特征,这是一个症状.它几乎可以破坏任何系统 - 不仅仅是git.我最近复制了一个Web转储.变音符号规范化打破了它,因为html文件引用了文件名中带有变音符号的图像.我敢打赌这也是一个安全问题. (2认同)

el.*_*cko 7

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

precomposeunicode = true
quotepath = false
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

# 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'
Run Code Online (Sandbox Code Playgroud)