Mercurial で 既にリポジトリに入っているファイル名を変更する

事情により既にリポジトリに追加されているファイル名を変更したくなった。具体的には Sencha Touch 2 でリポジトリをつくるときにスキャッフォールドとして hoge.js みたいにいっぱい配置しちゃってたけど、実際は Hoge.js と大文字にしないと認識されないのでそのリポジトリ問題を解決する。

リポジトリのファイル名を変更したのでマージに失敗した

以下ログ

[atas@ ~/work/(hg)-[ticket]-] hg merge default
abort: case-folding collision between hoge/app/controller/Main.js and hoge/app/controller/main.js

ググってみるとどうやら歴史改変して解決する方法があるが、ちょっとこわいのでやりたくなかった。なので達人に聞いたら解決方法を教えてくれた。

1 hoge_moge.js という _ を含んだ名前を変更する

これはどうやら単に mv すればいいだけらしい。あるいは rename, move

hg mv hoge_moge.js Hoge_moge.js

らしい。やってはないけど

2 hoge.js という完全に snake_case の名前を変更する

この場合は hg mv ではできないらしい。なので以下の方法をとった

  • hg forget でリポジトリから消す
  • commit
  • mv でファイル名変更
  • hg add で変更したファイル名を追加
  • commit

以下は具体的な手段

# リポジトリから削除
hg forget hoge.js
# commit する
hg ci
# mv して名前変更
mv hoge.js Hoge.js
# hg add で名前変更後のファイルをリポジトリに追加
hg add Hoge.js
# commit
hg ci

以上。コンフリクトとかはまあ普通に解消しましょう。