eol=lfでLF行末を強制する

シェルスクリプトや設定ファイルでのCRLF破損を防ぐため、特定のファイルタイプにUnixスタイルのLF行末を強制する.gitattributesの設定方法。

Line Endings

詳細な説明

eol=lfでLFを強制する

text=autoはリポジトリ内で行末を正規化しますが、Windowsでのチェックアウト時にはCRLFに変換されます。一部のファイルは開発者のプラットフォームに関係なく常にLFを使用する必要があります。シェルスクリプト、Makefile、特定の設定ファイルはCRLF行末では動作しません。

ディレクティブ

*.sh    text eol=lf
*.bash  text eol=lf
Makefile text eol=lf
*.yml   text eol=lf
*.yaml  text eol=lf

text eol=lfの組み合わせは2つのことを行います:

  1. text — ファイルを正規化対象のテキストファイルとしてマークします
  2. eol=lf — Windows上の作業ディレクトリでもLF行末を強制します

シェルスクリプトにLFが必要な理由

Unixシェル(bash、sh、zsh)は\r(キャリッジリターン)をコマンドの一部として解釈し、次のようなエラーが発生します:

/bin/bash^M: bad interpreter: No such file or directory

^MはCRLFのキャリッジリターン文字です。eol=lfを強制することで、Windows開発者もこれらのファイルで常にLF行末を取得でき、このクラスのバグを防ぎます。

LFが一般的に必要なファイル

ファイルタイプ 理由
*.sh*.bash シェルインタープリターがLFを要求
Makefile Makeがレシピ行にLFを要求
*.yml*.yaml 一部のYAMLパーサーがLFに敏感
.env DockerやdotenvがCRLFで失敗する可能性
Dockerfile Dockerビルドがcrlf行末で失敗する可能性
.editorconfig エディター設定の慣例

text=autoとの組み合わせ

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

より具体的なルールは、マッチするファイルパターンに対してグローバルなtext=autoを上書きします。

ユースケース

シェルスクリプト、Makefile、Dockerfile、またはCI設定ファイルを含むリポジトリは、それらのファイルタイプに`eol=lf`を使用する必要があります。これは、Windows開発者がUnixターゲットのデプロイスクリプトに貢献するプロジェクトで特に重要です。

試してみる — .gitattributes Generator

フルツールを開く