Git

git archive で日本語が含まれている場合の pathspec のエラー

More than 3 years have passed since last update.

OS X 10.9.5


問題点

git で日本語(マルチバイト)が含まれている場合に

git archive --format=zip head `git diff head head~10 --name-only` -o archive.zip

のようなコマンドで差分抽出を行おうとすると、履歴の中に日本語が含まれていると以下のようなエラーがでます。

fatal: pathspec '"\357\275\222.png"' did not match any files

この場合は、全角の r が含まれている為エラーが出ているようです。


対処方法


手動抽出

これは……やめましょう


エスケープをやめる

問題は diff の出力がエスケープされていることのようなので、以下のコマンドでエスケープを無効にしてしまいます。

これは現在の git のみですが、全てに適用が必要であれば --global をつけるといいかと思います。

git config --bool core.quotepath false

これで先のコマンドが正常に行える用になりました。

git archive --format=zip head `git diff head head~10 --name-only` -o archive.zip


NG


git diff の出力を改変

git diff の出力が

"\357\275\222.png"

となっているので、これを sed で r へ置換するとうまくいくと思ったのですが、ファイルが見つからないというエラーが出ました……

git archive --format=zip HEAD `git diff --name-only head head~10 | sed -e 's/\\\\357\\\\275\\\\222/r/g'` -o archive.zip


zip コマンド

少し検証してみると、git diff の出力は問題なく、git archive でのマルチバイトの扱いに問題があるような挙動でした。

なので git archive ではなく zip コマンドを利用して差分抽出してみようと思います。

zip -r archive.zip `git diff head head~10 --name-only`

これでカレントディレクトリに archive.zip が作成されました。

できたと思ったのですが、日本語ファイルが含まれていませんでした…


参考

http://staffblog.yumemi.jp/subversion%E3%81%8B%E3%82%89git%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8Dutf8%E3%81%AB-2/