やりたいこと
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: まだありません。