はじめに
$ file foo.reg
foo.reg: Little-endian UTF-16 Unicode text, with CRLF line terminators
レジストリファイル (.reg) はテキストファイルであるが,
UTF-16 は, 以下のようにバイナリとして認識されてしまうため, 適切に処理できない.
$ less foo.reg
"foo.reg" may be a binary file. See it anyway?
$ grep HKEY foo.reg # 何も出力されない
$ sed 's/HKEY/hkey/g' foo.reg # 変換されない
$ diff foo.reg bar.reg
Binary files foo.reg and bar.reg differ
$ git grep HKEY # 何も出力されない
$ git diff
Binary files a/foo.reg and b/foo.reg differ
テキスト処理したり, Gitで管理できるようにするためには, nkf
でUTF-8に変換すればいい.
UTF-16をdiff
プロセス置換でUTF-8に変換してから, diff
に渡す.
$ diff <( nkf -w foo.reg ) <( nkf -w bar.reg )
なお, vim
はUTF-16のファイルを見ることができるので, vimdiff
を使ってもいい.
UTF-16でGit
まず, 以下のように, UTF-8に変換するフィルタを設定する.
$ git config --global diff.to_utf8.textconv 'nkf -w'
そうすると, ~/.gitconfig
に以下のような行が追加されている.
~/.gitconfig
[diff "to_utf8"]
textconv = nkf -w
このフィルタを*.reg
に適用したい場合は, .gitattributes
に以下の行を追加する.
.gitattributes
*.reg diff=to_utf8
以上により, git diff
する前に, *.reg
のファイルはnkf
でUTF-8に変換されるため,
レジストリファイルもgit diff
で見ることができるようになる.
git grep
も--textconv
オプションで見ることができる.
$ git grep --textconv HKEY # 出力される
参考