Gitで、事前にUnicodeの結合を行う

WindowsMacリポジトリを共有していると、日本語ファイル名の問題が出てきます。「ボタン.png」のようなファイルがあった場合、Windowsファイルシステムでは「ボ」はひとつのコードポイントとして扱われますが、Macファイルシステムでは「ホ」と「゛」が分解されます。 これは、Unicodeの結合文字に対する正規化の扱いが、OSのファイルシステムごとに異なるということです。

これによって、Gitを使ってWindowsで「ボタン.png」をコミットし、Macでそのコミットを持ってくると、「ボタン.png」を削除して「ホ゛タン.png」を追加するような動作になるのです。

この問題を解決するために、Mac OSでのGit実装には、core.precomposeUnicodeという設定があります。configファイルで以下のようになっていた場合、

[core]
    …
    precomposeunicode = false

これをtrueに変更して保存します。

[core]
    …
    precomposeunicode = true

これで、Mac上でのGitリポジトリでは、事前にUnicodeの結合文字が結合され、Macファイルシステムで「ホ゛タン.png」が「ボタン.png」として見なされるようになります。

ドキュメントの翻訳

Git 2.7.1時点での、core.precomposeUnicodeの説明を翻訳して掲載しておきます。

このオプションは、GitのMac OS実装でのみ使用する。core.precomposeUnicode=trueとした場合、Mac OSでのファイル名のUnicode分解を元に戻す。これは、Mac OSLinuxWindows間でリポジトリを共有する際に役立つ。(Git for Windows 1.7.10以上が必要、もしくはGit under cygwin 1.7)。 これがfalseの場合、ファイル名はGitからは完全に透明に扱われ、古いGitとの後方互換性を持つ。

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.

参照