サーバー上でgit pullを実行した際、ファイルの内容は変更していないのにエラーが発生することがあります。これはファイルパーミッションの変更がGitに検出されているためです。
問題の症状
git diffを実行すると、以下のようにファイルモードの変更のみが表示されます:
diff --git a/path/to/file.php b/path/to/file.php
old mode 100644
new mode 100755
この状態でgit pullを実行すると、ローカルに未コミットの変更があるとしてエラーになります。
原因
以下のような状況で発生します:
- FTP/SFTPでファイルをアップロードした際にパーミッションが変わった
- エディタやIDEがファイルを保存する際にパーミッションを変更した
- Windows環境とLinux環境間でファイルをやり取りした
解決方法
方法1: 変更を破棄してからpull
git checkout path/to/file.php
git pull
方法2: stashを使用
git stash
git pull
git stash pop # 必要なら変更を戻す
方法3: パーミッション変更を無視する設定(推奨)
git config core.fileMode false
git checkout .
git pull
この設定により、Gitはファイルパーミッションの変更を追跡しなくなります。サーバー環境ではcore.fileMode falseに設定しておくことで、同様のトラブルを未然に防げます。
グローバル設定にする場合
すべてのリポジトリでパーミッション変更を無視したい場合は、--globalオプションを使用します:
git config --global core.fileMode false