自分の速さで

調べたこと、忘れそうなことをゆるゆると書いていく

Git Bash で svn status を実行すると日本語のファイル名が文字化けする & 対処法

はじめに

Windows環境でSubversionでマージを自動で実行する仕組みを作りたかったのですが、今回はGit Bashでシェルを実行する方針で作成を進めていました。

マージする前に不要なファイルのゴミ掃除をしたかったので、下記を参考にバージョン管理外のファイルを削除しようと思ったのですが、うまく行かなかったのでその原因と解決策をメモ。

kakakakakku.hatenablog.com

エラー内容

テストとして、Subversion管理外のファイルを下記のフォルダ構成で配置しています。

current directory/
  ├src/
  │  └ abc.txt
  ├ test.txt
  ├ 新しいテキスト ドキュメント (2).txt
  └ 新しいテキスト ドキュメント.txt

なので、以下のコマンドを実行した場合

$ svn status | grep ^?
?       src\abc.txt
?       test.txt
?       新しいテキスト ドキュメント (2).txt
?       新しいテキスト ドキュメント.txt

上記の結果であれば、cutで9文字目を切り出しxargsで対象を全て削除することができるのですが…

実際は下記の内容が出力されました

$ svn status
?       src\abc.txt
?       test.txt
?       ▒V▒▒▒▒▒e▒L▒X▒g ▒h▒L▒▒▒▒▒▒▒g (2).txt
?       ▒V▒▒▒▒▒e▒L▒X▒g ▒h▒L▒▒▒▒▒▒▒g.txt

解決策

Subversionの出力が明らかに文字化けしているので、文字コードをShift-JISからUTF-8に変換してみました。

$ svn status | iconv -f Shift-JIS -t UTF-8 | grep ^?
?       src\abc.txt
?       test.txt
?       新しいテキスト ドキュメント (2).txt
?       新しいテキスト ドキュメント.txt

これで想定通り検出できました。

そもそもSubversionの出力の文字コードUTF-8に変更できたらこんなことはする必要ありませんね。(変更できるかどうかは調べていません。。)

おわりに

Git bash 上でバージョン管理外のファイルを削除するコマンドは、最終的に以下のようになってます。

svn status | sed -e 's@\\@/@g' | iconv -f Shift-JIS -t UTF-8 | grep ^? | cut -c9- | xargs -I{} rm -rf "{}"

理由は以下のとおりです。

  • Git Bashなので、フォルダ区切り文字を \ から / に変える必要がある
  • ファイル名にスペースが入っている場合うまく消せないので、rm するときはダブルクォーテーションで囲む必要あり