今日、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にファイル名を正しく読み取らせる解決策はありますか?
Macでcore.precomposeunicodeを有効にする
git config --global core.precomposeunicode true
これを機能させるには、少なくともGit 1.8.2が必要です。
Mountain Lionは1.7.5で出荷されます。新しいgitを取得するには、 git-osx-installer または homebrew を使用します(Xcodeが必要です)。
それでおしまい。
原因は、ファイルシステムがファイル名を格納する方法の異なる実装にあります。
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はファイル名を比較します正規化後。
次の〜/ .gitconfigに配置されたものは、10.12.1 SierraでUTF-8名に対して機能します。
precomposeunicode = true
quotepath = false
最初のオプションはgitがUTF-8を「理解」するために必要であり、2番目のオプションは文字をエスケープしないようにするために必要です。
作る 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'
リポジトリの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と下位互換性があります。
合ってます。
ファイル名は TF-8 にあります。Üは、ラテン大文字Uとダイアレス文字(ユニコード0x00dc、utf8 0xc3 0x9c)ではなく、ラテン大文字U +コンバインダイアレス(ユニコード0x0308、utf8 0xcc 0x88)として表されます。 。 Mac OS X HFSファイルシステムは、Unicodeをこのような方法で分解します 。 Git は、非ASCIIファイル名バイトの8進エスケープ形式を示します。
Unicodeファイル名を使用すると、リポジトリが移植できなくなる場合があります。たとえば、 msysgitはUnicodeファイル名の処理に問題がありました 。
私の個人リポジトリにも同様の問題があったため、Python 3でヘルパースクリプトを作成しました。ここで把握できます。 https://github.com/sjtoik/umlaut-クリーナー
スクリプトは少し手作業が必要ですが、それほど必要ではありません。