web-dev-qa-db-ja.com

Mac OS XでのGitとUmlautの問題

今日、Mac OS XのGitに関するバグを発見しました。

たとえば、überschrift.txtという名前のファイルの先頭にドイツ語の特殊文字withをコミットします。コマンド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にファイル名を正しく読み取らせる解決策はありますか?

68
LuckyMalaka

Macでcore.precomposeunicodeを有効にする

git config --global core.precomposeunicode true

これを機能させるには、少なくともGit 1.8.2が必要です。

Mountain Lionは1.7.5で出荷されます。新しいgitを取得するには、 git-osx-installer または homebrew を使用します(Xcodeが必要です)。

それでおしまい。

87
Leo

原因は、ファイルシステムがファイル名を格納する方法の異なる実装にあります。

Unicodeでは、Üは2つの方法で表すことができます。1つはÜだけで表現する方法、もう1つはU + "ウムラウト文字を組み合わせる"方法で表現する方法です。 Unicode文字列には両方の形式を含めることができますが、両方を持つのは混乱するので、ファイルシステムはすべてのウムラウト付きUをÜ、またはU + "ウムラウト文字の組み合わせ"に設定することにより、Unicode文字列を正規化します。

Linuxは、Normal-Form-Composed(またはNFC)と呼ばれる前者の方法を使用し、Mac OS Xは、Normal-Form-Decomposed(NFD)と呼ばれる後者の方法を使用します。

どうやら Git はこの点を気にせず、単にファイル名のバイトシーケンスを使用するため、問題が発生します。

メーリングリストスレッドGit、Mac OS Xおよびドイツ語の特殊文字にはパッチが含まれているため、Gitはファイル名を比較します正規化後。

31
Yuji

次の〜/ .gitconfigに配置されたものは、10.12.1 SierraでUTF-8名に対して機能します。

precomposeunicode = true
quotepath = false

最初のオプションはgitがUTF-8を「理解」するために必要であり、2番目のオプションは文字をエスケープしないようにするために必要です。

7
el.nicko

作る 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'
5
pete

リポジトリのOSX固有のcore.precomposeunicodeフラグをtrueに変更します。

git config core.precomposeunicode.true

新しいリポジトリがそのフラグを確実に取得するようにするには、次のコマンドも実行します。

git config --global core.precomposeunicode true

マンページの関連スニペットは次のとおりです。

このオプションは、GitのMac OS実装でのみ使用されます。 core.precomposeunicode = trueの場合、GitはMac OSによって行われたファイル名のユニコード分解を元に戻します。これは、Mac OSとLinuxまたはWindowsの間でリポジトリを共有する場合に役立ちます。 (Windows 1.7.10以降のGit、またはcygwin 1.7のGitが必要です)。 falseの場合、ファイル名はGitによって完全に透過的に処理されます。これは、古いバージョンのGitと下位互換性があります。

3
user1338062

合ってます。

ファイル名は TF-8 にあります。Üは、ラテン大文字Uとダイアレス文字(ユニコード0x00dc、utf8 0xc3 0x9c)ではなく、ラテン大文字U +コンバインダイアレス(ユニコード0x0308、utf8 0xcc 0x88)として表されます。 。 Mac OS X HFSファイルシステムは、Unicodeをこのような方法で分解しますGit は、非ASCIIファイル名バイトの8進エスケープ形式を示します。

Unicodeファイル名を使用すると、リポジトリが移植できなくなる場合があります。たとえば、 msysgitはUnicodeファイル名の処理に問題がありました

1
laalto

私の個人リポジトリにも同様の問題があったため、Python 3でヘルパースクリプトを作成しました。ここで把握できます。 https://github.com/sjtoik/umlaut-クリーナー

スクリプトは少し手作業が必要ですが、それほど必要ではありません。

0
crysaz