サーバー上で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