Gitの改行コード設定:.gitattributesのtext・eolとcore.autocrlfの違い
git diffに^Mが表示されるときに確認する設定を、Git公式ドキュメントに基づいて整理しました。core.autocrlfと.gitattributesのtext・eolがそれぞれ何を決めるのか、すでにCRLFでコミットされたファイルの直し方も扱います。
Windowsで編集したファイルをgit diffで見ると、新しく追加した行の末尾に^Mが表示されることがあります。Git FAQによると、Gitは既定でUnixの改行(LF)を想定しています。そのため、Windowsの改行(CRLF)に含まれるCRを行末の空白として扱い、^Mと表示します。行末の空白は、既定では新しく追加された行でだけ表示されます。
改行を扱う設定はcore.autocrlfと.gitattributesの2か所にあり、役割が異なります。
変換が起きる2つの場面
改行の変換は、ファイルがテキストとして扱われる場合にだけ行われます。インデックスに追加するときに行末がLFに正規化され、作業ディレクトリに取り出すときには、設定によってLFがCRLFに変換されることがあります。
テキストかどうかはtext属性で決まります。属性がないファイルはcore.autocrlfに従います。
core.autocrlf
core.autocrlf=trueは、すべてのファイルにtext=autoを付け、core.eolをcrlfにしたのと同じです。inputでは、取り出すときに変換しません。
gitattributesのドキュメントは、この設定を、どのリポジトリでも自分の作業ディレクトリをCRLFにしたい場合の選択肢として説明しています。自分が追加するテキストファイルはLFに正規化しますが、リポジトリ全体に正規化を強制するものではありません。誰が追加しても同じ規則を適用するには、リポジトリにtext属性を指定します。
.gitattributes
コミットされた.gitattributesは、リポジトリと一緒に共有されます。ただし、各クローンの$GIT_DIR/info/attributesのほうが優先順位が高いため、ローカルの設定は異なる場合があります。
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.jpg -text
text=auto: 内容を見て、Gitがテキストかどうかを判断します。text: テキストとして扱います。-text: 改行の変換を試みません。eol=lf、eol=crlf: 作業ディレクトリで使う改行を固定します。
eolはtextまたはtext=autoのときに効果があります。textが未指定なら、eolを指定するとtextも自動的に設定されます。
eolのないテキストファイルはcore.autocrlfまたはcore.eolに従います。どちらも設定されていなければ、WindowsではCRLF、それ以外のプラットフォームではLFで取り出されます。core.eolの既定値はnativeで、core.autocrlfがtrueかinputのときは無視されます。
Git FAQは、テキストファイルをLFで保存し、テキストとバイナリを.gitattributesに明示することを勧めています。シェルスクリプトにはLF、バッチファイルにはCRLFが必要だという例も挙げています。
すでにCRLFでコミットされたファイル
text=autoは、インデックスにすでにCRLFで保存されたファイルを変換しません。そのため、.gitattributesを追加しただけでは既存のファイルは変わりません。
Gitのドキュメントにある手順は、クリーンな作業ディレクトリで.gitattributesを作成し、次のコマンドを実行し、git statusで対象を確認してからコミットするというものです。
git add --renormalize .
このオプションは単独のCRには手を付けません。
現在の状態はgit ls-files --eolで確認できます。次はMotitoryサイトのリポジトリでGit 2.39.5(Apple Git-154)を使って実行した結果です。
i/lf w/lf attr/text=auto eol=lf .gitattributes
i/はインデックス、w/は作業ディレクトリの改行、attr/は適用されている属性です。
注意点
git-configのドキュメントには、CRLF変換にはデータを壊す可能性がわずかにあると書かれています。LFとCRLFが混在したファイルは、コミット後に元の状態を再現できません。バイナリをテキストと誤って分類した場合も内容が壊れることがあるため、そのようなファイルには-textを指定します。
core.safecrlf=trueなら元に戻せない変換を拒否し、warnなら警告だけを表示します。
この記事はGit 2.56.0のドキュメントに基づいています。エディタの改行設定と、Git for Windowsのインストーラーにある選択肢は扱っていません。
参照したドキュメント
いずれもGitプロジェクトのドキュメントです。改行の変換は独立した標準ではなく、Gitの実装上の動作です。
- gitattributes:
text、eol、改行の変換、属性ファイルの優先順位。 - git-config:Git 2.56.0の設定ドキュメント。
- gitfaq:
^M、LFとCRLF、クロスプラットフォーム向けの推奨事項。 - Documentation/config/core.adoc:
core.autocrlf、core.eol、core.safecrlfの原文。 - git-add:
--renormalize。 - git-ls-files:
--eol、i/、w/、attr/。
リンクと内容は2026年9月30日に確認しました。