逆引きマニュアル: Git: ファイル名にUTF-8以外のエンコーディングを使用する

投稿日: 更新日:

やりたいこと

gitでファイル名にUTF-8以外(EUC-JPなど)を使用したい場合の回避方法です。

前提パッケージ

  • git2u-2.14.2-1.ius.centos6
  • unzip-6.0-5.el6

CentOS 6に入っているgit 1.7.1では正しくファイル名が処理できませんでした。 1.7.11.2の以下の修正が影響している可能性が高いです。

 * "git archive" incorrectly computed the header checksum; the symptom
   was observed only when using pathnames with hi-bit set.

手順

Gitそのものでは今のところ成功してません。 ただし、unzipコマンドで展開するときに、ファイル名のエンコーディングが指定可能です。

OUTPUT_PATH=~
EXTRACT_PATH=~/tmp
git archive HEAD --output=${OUTPUT_PATH}/master.zip
unzip -o -O utf-8 -I euc-jp ${OUTPUT_PATH}/master.zip -d ${EXTRACT_PATH}
  • gitのオプション: git-archive参照。
  • unzipのオプション
    • -o: ファイルを確認せずに上書きする
    • -O: 入力ファイル名のエンコーディング
      • マニュアルにも書かれていません。unzip -hコマンドではspecify a character encoding for DOS, Windows and OS/2 archivesと出るようです。
    • -I: 出力ファイル名のエンコーディング
      • マニュアルにも書かれていません。unzip -hコマンドではspecify a character encoding for UNIX and other archivesと出ます。
    • -d: 出力先ディレクトリ

Gitでできないか?

Gitでチェックアウトしたときにできないか調べてみました。 結果的にはうまくいっていません。

考えたのは、gitattributes + convmvを使ったもの。

まず、.git/config に以下の設定を追加します。

[filter "convmv"]
	clean = convmv -f euc-jp -t utf-8 %f --notest
	smudge = convmv -f utf-8 -t euc-jp %f --notest

次に、.gitattributesまたは.git/info/attributesに以下の設定を追加しました。

*.txt filter=convmv

ただ、これだとうまくいきません。 convmvでファイル名が見つからないというエラーが出ます。 おそらくconvmvに渡す引数をエスケープしないといけないのかなと。

できるかもしれませんが、以下のようにファイルアクセスは非推奨とのことなので、 やらない方が良さそうです。

So, smudge and clean commands should not try to access the file on disk, but only act as filters on the content provided to them on standard input.

マニュアル

  • Git
  • encoding: まだありません。