症状
ステージングへのファイル追加 (git add) において "LF would be replaced by CRLF in xxx" エラーが発生して失敗する。
エラー発生例
1 2 |
$ git add readme.txt fatal: LF would be replaced by CRLF in readme.txt |
1 2 |
$ git add *.json fatal: LF would be replaced by CRLF in .vscode/c_cpp_properties.json |
エラーの原因、背景
ステージング (git add) を試みたファイルの改行コード形式がLFであった。もし、このままステージングを許してチェックアウトするとステージング前の改行コード形式がLFで、チェックアウト後の改行コード形式が自動変換の結果 CRLFとなり一致しない。ステージング前と後でファイルが一致しない(改行コードが異なる)のは "宜しくない" 。そこで、git add コマンドはエラーに倒してステージングを失敗させます。
解決方法1 : 改行コード形式にこだわりのないテキストファイルのとき
エラーが発生したテキストファイル(たとえば readme.txt)の改行コードをCRLF形式に変換した後に、あらためてステージングを試みる。こうすると、ステージング前もチェックアウト後も改行コード形式はCRLF形式で一致するため、git addコマンドはエラー判定しない。ただし、gitコマンドの背景ではリポジトリに投入するときに LF形式 ⇒ CRLF形式、リポジトリから取り出すときに CRLF形式 ⇒ LF形式 の自動改行コード変換が走っていることに留意する必要があります。留意する必要はありますが、そもそもテキストファイルの改行コード形式にこだわりがないのであれば悪影響はないでしょう。
解決方法2 : 自動改行コード変換を回避したいとき
Gitリポジトリへの投入/取出の過程で自動的にテキストファイルの改行コード変換 LF ⇔ CRLF が実行されることを避けたいとき
1. 一部のファイル限定で自動改行コード変換を回避する
たとえば、拡張子 json 限定で自動改行コード変換を回避する。たとえば *.json
に対して.gitattributes
ファイルに次のように binary属性 を設定する。binary属性が設定されたファイルは無条件で自動改行コード変換の対象から外される。一方で、EXCELファイル(*.xlsx)などはbinary属性を設定していないばあいでも、gitがbinaryファイル(自動改行コード変換対象外)と自動判定する。自動判定の精度が心配であれば *.xlsx などにもbinary属性を設定するのが確実である。
1 |
*.json binary |
2. 全てのファイルで自動改行コード変換を回避する
1 |
$ git config --local core.autocrlf false |
補足
Linux や MacOS のテキストファイルの改行コードはデフォルトで LF形式 である。したがって上記の自動改行コード変換の対象外である。Windowsプラットフォーム上で動作する Git ツール だけが自動改行コード変換の機能を有しており、その結果、件名の不具合が発生するばあいがある。