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(-)
参考: