Posted at

git add時のwarning: LF will be replaced by CRLFを消したかった話し

windows環境でローカルリポジトリをaddした際に、warning: LF will be replaced by CRLFと警告が出て、鬱陶しいので解消したかった話し。

結論述べると、消さなくてもいっかなとなりました。


原因

config設定のcore.autocrlfcore.safecrlfが関係します。

参考

公式リファレンス:git-config

公式リファレンス:Customizing Git - Git ConfigurationのFormatting and Whitespaceの項目


core.autocrlf

core.autocrlfがtrueに場合に、下記を行います。

- check out時、LFをCRLFに変換

- addの時、CRLFをLFに変換


core.safecrlf

core.safecrlfがwarnに設定されている場合は、addしたタイミングで下記2つのファイルが一致しない場合に警告を出します。

- addの対象となったファイル

- addの対象となったファイルをcore.safecrlfの設定内容でcheckoutした際のファイル

上記コンフィグの設定値は、下記コマンドで確認できます。

git config --global core.autocrlf

# true

git config --global core.safecrlf

# warn

addのタイミングでこの警告が出るため、LFがCRLFに変換されてインデックスに追加されちゃうように勘違いしてましたが、

実際に起きていた事は、addしようとしていたfileが元からLFで、core.safecrlfの設定内容でcheckoutした際のファイルはCRLFになるはずなのに一致してないよとエラーが出されていたようです。この警告が本来意味するのは、(チェックアウト時に)LFがCRLFに変換されるよという事のようです。

念のため、ワークツリーとインデックスで改行コードの変換有無を下記コマンドで確認してみましたが、addしたタイミングで、LFはLFのままである事とCRLFがLFに変換される事を確認しました。

# CRのgrep

git grep -I $'\r'
git grep --cached -I $'\r'

というわけで、もともとLFでコミットしたかったので、警告は無視できると判断しました。

チェックアウト時の自動変換の動きをざっと確認した感じでは、既にチェックアウト済みの場合、差分が発生していないファイルではgit checkoutしても自動変換は起きないようでした。

-fオプションを付ければ、自動変換を強制的に実行できますが、作業途中のファイルは消し飛ぶのでご注意ください。


補足


理由もなくcore.autocrlfをfalseにしてはいけない

調べる中で、core.autocrlfをfalseにすれば警告が消えるという解決方法を見ましたが、正当な理由がなければやるべきではないと思います。

safecrlfが機能しなくなるので、当然警告は止まるわけですが、addしたタイミングでCRLFからLFへの自動変換が利かなくなります。

Windows環境のみを想定した開発なら問題ないですが、MACやLINUXでも作業する場合にCRLFが混在するリスクが生じます。


そもそも何のために警告出しているの?

LF<=>CRLFの変換は、ファイルの変換作業のため安全ではありません。

誤ってテキストに分類されてしまったバイナリファイルがあれば、データが破損します。

こうしたファイルの存在を早いタイミングで気づけるように警告を出しています。

そのようなファイルがもしあれば、.gitattributesでバイナリファイルとして認識させればよいです。


core.autocrlf inputについて

checkout時は自動変換を行わず、addするタイミングでCRLFをLFに自動変換するようになります。

リポジトリをLFで統一したい場合はこの設定が、有用かもしれません。