msysgit でファイルを変更していないはずなのに merge できない場合の対処

msysgit を使っていて、管理下のファイルを何も変更していないはずなのに merge や pull するときに、「変更されている」とエラーになる場合。そして reset --hard をしてもそのエラーが消せない場合。
この場合、ファイル本体に変更はなくても msys から見た場合のファイルモード(パーミッション)が違っていて、git がそれを「変更あり」と検知している可能性があります。
git diff をしたときに

old mode 100755
new mode 100644

のようにファイルモード(パーミッション)の変更だけが出る場合はたぶんこの問題です。

これに対処するには、

>git config core.filemode false

としてやることで、ファイルモードの変更は無視され、pull や merge ができるようになります。
cygwinやmsysの細かいことは知らないのですが、Xnixのパーミッションっぽいものを内部で持っているらしいです)


以下自分がハマった場合ですが、リポジトリから clone してからしばらく放置してたものを git pull しようとしたら変更してないにも関わらず 「変更されてる」とエラー。

C:\gittest>git pull
Updating 0650599..b4d4388
error: Your local changes to the following files would be overwritten by merge:
        foobar
Please, commit your changes or stash them before you can merge.
Aborting

それならば、と git reset --hard で変更をチャラにしてみてもまだ同じエラー。orz

C:\gittest>git reset --hard
HEAD is now at 0650599 updated foobar

C:\gittest>git pull
Updating 0650599..b4d4388
error: Your local changes to the following files would be overwritten by merge:
        foobar
Please, commit your changes or stash them before you can merge.
Aborting

そんなわけはないだろうと git diff をすると、何か変更点がある。mode って何?

C:\gittest>git diff


diff --git a/foobar b/foobar
old mode 100755
new mode 100644

ググって、参考サイトを見つけファイルモードの変更を無視するように設定すると、diff も無くなり pull できるようになりましたとさ。というお話。

C:\gittest>git config core.filemode false

C:\gittest>git diff

C:\gittest>git pull
Updating 0650599..b4d4388
Fast-forward
foobar                                     |    2 +-
1 files changed, 2 insertions(+), 2 deletions(-)

参考: