できない.dev

Prettier で `Delete ␍` の改行コードエラーが消せない

Windows で checkout した CRLF ファイルに対して Prettier 既定の LF と差分が出るのが原因。
endOfLine: auto と .gitattributes の併用で恒久的に解決する。

#prettier#eol#crlf#line-ending#windows

公開:

要約

Delete ␍ がファイル全行に出る」「Prettier を実行すると全行が変更扱いになる」現象は、CRLF と LF の改行コード差。
Prettier の endOfLine"auto" にし、.gitattributes で LF に統一すれば再発しなくなる。

よくある原因

  1. Windows で git config --global core.autocrlf true になっており、checkout 時に CRLF へ変換される
  2. Prettier の既定 endOfLinelf のため、CRLF ファイルを「LF に直せ」と差分指示してくる
  3. .gitattributes がリポジトリに無いので OS ごとに改行コードが揺れる
  4. VS Code の「Files: Eol」設定が \r\n になっている

解決策

1. Prettier の設定を "auto"

{
  "endOfLine": "auto"
}

"auto" はファイル先頭の改行コードを尊重するので、CRLF も LF も「現状維持」になる。
リポジトリ全体を LF で揃えたい場合は "lf" を指定し、次の .gitattributes と組み合わせる。
各値の意味は Prettier 公式ドキュメント を参照。

2. .gitattributes で改行コードを正規化

リポジトリルートに以下を置く:

* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf

text=auto で Git が「テキストファイルらしいもの」を自動判定し、eol=lf で working tree に LF で展開する。.bat / .cmd だけは Windows の制約で CRLF を強制する。

3. 既存ファイルを再正規化

.gitattributes 追加直後は、既存コミット済みファイルの改行コードはそのまま。
以下で一括正規化する:

git add --renormalize .
git status   # 改行コードだけが変わったファイルが大量に表示される
git commit -m "Normalize line endings to LF"

4. エディタ側も合わせる

VS Code なら settings.json に:

{
  "files.eol": "\n"
}

ESLint と Prettier を併用している場合、ESLint 側の linebreak-style ルールも同じ向きに揃えないと、片方が CRLF を要求して堂々巡りになる。

この記事は役立ちましたか?