Skip to content

toona note

Git 未変更ファイルが modified file となる現象への対処

内容

linux, windows の両環境での開発時、

  • 変更していないファイルも modified file として検知されてしまう現象
  • ファイルのパーミッション変更を検知する現象

への対応方法を記します。
Docker dev contaienr を用いた開発時などに、ファイル管理の利便性向上のために設定するとよいです。

結論

  • .gitattributes を記述する。 記述方法はここを参照
  • ファイルのパーミッション検知を無効化する

詳細

内容を変更していないファイルを modified file と検知する問題

内容を変更していないファイルを modified file と検知してしまう現象の原因はファイルの改行コードの違いであることがあります。
git diff で変更内容を確認した際に、各行末に^Mと記されていた場合、windows と linux の改行コードの違いに起因しています。
改行コードは .sh.bat 等のファイルにより適切な改行コードが異なり、全てのファイルを同一の改行コードに無理やり合わせることは、スクリプトが実行できなくなるなどの弊害を生む可能性があります。
そこで、.gitattributes を記述して、ファイルの種類ごとに適切な改行コードを設定ます。
.gitattributes については、とりあえず、microsoft が示しているここを参照してみます。

* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

* text=auto eol=lf は全てのファイルをテキストファイルとして検知して、その改行コードを LF (linux の改行コード) に変換することを示しています。
*.{cmd,[cC][mM][dD]} text eol=crlf.cmd.CMDファイルは改行コードを CRLF (windows の改行コード)に変換することを示しています。
\*.{bat,[bB][aA][tT]} text eol=crlf.bat.BATファイルは改行コードを CRLF に変換することを示しています。
これらの変更によって、 linux と windows 間の改行コードの不一致が modified file として検知されることを防げます。

フィルのパーミッション変更を検知してしまう問題

linux で編集しているファイルを windows 側でも開くと、パーミッションが 755 から644に変更されたとして、ファイルの変更を検知します。
git はファイルのパーミッション変更を無視する設定があります。
最初に windows 側でファイルのパーミッションを追跡する設定になっているかを確認します。

git config core.filemode

true であるならば linux windows 間でパーミッション変更が発生し、git が検知する状態です。
windows 側で

git config core.filemode false

とすることで、ファイルのパーミッションの追跡を停止することができます。

結語

大量の modified file の発生は今まで不便だと感じながらも後回しにしていた問題でした。
これでより快適な開発を行えます。