IT Share you

Mac OS X의 Git 및 Umlaut 문제

shareyou 2020. 11. 7. 17:55
반응형

Mac OS X의 Git 및 Umlaut 문제


오늘 저는 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이 파일 이름을 올바르게 읽도록하는 솔루션이 있습니까?


Mac에서 core.precomposeunicode 활성화

git config --global core.precomposeunicode true

이것이 작동하려면 최소한 Git 1.8.2가 있어야합니다.

Mountain Lion은 1.7.5와 함께 제공됩니다. 최신 git을 얻으려면 git-osx-installer 또는 homebrew를 사용하십시오 (Xcode 필요).

그게 다야.


원인은 파일 시스템이 파일 이름을 저장하는 방법이 다르게 구현 되었기 때문입니다.

유니 코드에서 Ü는 두 가지 방식으로 표현 될 수 있습니다. 하나는 Ü로만 표시되고 다른 하나는 U + "움라우트 문자 결합"으로 표시됩니다. 유니 코드 문자열은 두 형식을 모두 포함 할 수 있지만 두 형식을 모두 포함하는 것이 혼란 스럽기 때문에 파일 시스템은 모든 움라우트 -U를 Ü 또는 U + "움라우트 문자 결합"으로 설정하여 유니 코드 문자열을 정규화합니다.

Linux는 Normal-Form-Composed (또는 NFC)라는 전자의 방법을 사용하고 Mac OS X는 Normal-Form-Decomposed (NFD)라는 후자의 방법을 사용합니다.

분명히 Git 은이 점에 대해 신경 쓰지 않고 단순히 파일 이름의 바이트 시퀀스를 사용하므로 문제가 발생합니다.

메일 링리스트 스레드 Git, Mac OS X 및 독일어 특수 문자 에는 Git이 정규화 후 파일 이름을 비교하도록 패치가 있습니다.


~ / .gitconfig에 넣은 다음은 UTF-8 이름의 10.12.1 Sierra에서 나를 위해 작동합니다.

precomposeunicode = true
quotepath = false

첫 번째 옵션은 git이 UTF-8을 '이해'하고 두 번째 옵션은 문자를 이스케이프하지 않도록 필요합니다.


하기 위해서는 git add file맥 OS X의 파일 이름에 움라우트와 일을, 당신은 canonically 분해 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'

저장소의 OSX 관련 core.precomposeunicode플래그를 true로 변경 합니다.

git config core.precomposeunicode.true

새 저장소에 해당 플래그가 있는지 확인하려면 다음을 실행하십시오.

git config --global core.precomposeunicode true

다음은 맨 페이지의 관련 스 니펫입니다.

This option is only used by Mac OS implementation of Git. When core.precomposeunicode=true, Git reverts the unicode decomposition of filenames done by Mac OS. This is useful when sharing a repository between Mac OS and Linux or Windows. (Git for Windows 1.7.10 or higher is needed, or Git under cygwin 1.7). When false, file names are handled fully transparent by Git, which is backward compatible with older versions of Git.


It is correct.

Your filename is in UTF-8, Ü being represented as LATIN CAPITAL LETTER U + COMBINING DIAERESIS (Unicode 0x0308, utf8 0xcc 0x88) instead of LATIN CAPITAL LETTER U WITH DIAERESIS (Unicode 0x00dc, utf8 0xc3 0x9c). The Mac OS X HFS file system decomposes Unicode in a such way. Git in turn shows the octal-escape form of the non-ASCII filename bytes.

Note that Unicode filenames can make your repository non-portable. For example, msysgit has had problems dealing with Unicode filenames.


I had similar problem with my personal repository, so I wrote a helper script with Python 3. You can grap it here: https://github.com/sjtoik/umlaut-cleaner

The script needs a bit of manual labour, but not much.

참고 URL : https://stackoverflow.com/questions/5581857/git-and-the-umlaut-problem-on-mac-os-x

반응형