Gitの改行変換はtext属性とautocrlfどちらが効く?

本記事はアフィリエイトリンクを含みます。Amazon のアソシエイトとして、TechAthletes は適格販売により収入を得ています。価格・割引・在庫は変動するため、最新の条件は各公式サイトでご確認ください。

何が困るのか

Windows と macOS / Linux が混ざったチームで、触っていないはずのファイルが git status に大量に出てくる。差分を見ると全行が変わっているが、中身の文字は同じで、改行コードだけが CRLF と LF で入れ替わっている。こういうとき「core.autocrlf を true にしろ」「いや .gitattributes に * text=auto を書け」と、人によって言うことが違う。

どちらも間違いではないが、効く範囲と優先順位が違う。両方書いてあるときにどちらが勝つのかを、公式ドキュメントの記述だけで整理する。

公式はどう書いているか

gitattributes のドキュメントは、text 属性が「未指定(Unspecified)」のときだけ core.autocrlf が使われる、と書いている。

If the text attribute is unspecified, Git uses the core.autocrlf configuration variable to determine if the file should be converted.

出典: https://git-scm.com/docs/gitattributes (取得日 2026-10-15)

つまり .gitattributes に text が書いてあれば、そちらが先で、core.autocrlf は出番がない。core.autocrlf は「属性で何も決めていないファイル」に対する既定値である。

同じ文書は、属性がとりうる状態を 4 つに分けている。名前だけ書けば Set、先頭に - を付ければ Unset、= で値を付ければ Set to a value、どのパターンにも当たらなければ Unspecified。さらに「複数のパターンが当たるときは後の行が先の行を上書きし、上書きは属性ごとに行われる」とある。

ファイル単位の優先順位も明記されている。$GIT_DIR/info/attributes が最優先、次に対象ファイルと同じディレクトリの .gitattributes、その親ディレクトリを作業ツリーのトップまで順に見て、最後にグローバルとシステム全体のファイルが最も低い優先度で参照される。グローバル側の既定の場所は core.attributesFile で指定し、未指定なら $XDG_CONFIG_HOME/git/attributes、それも無ければ $HOME/.config/git/attributes が使われる。

比べた表

text 属性の状態ごとに、チェックイン(index に入れるとき)とチェックアウトで何が起きるかを、ドキュメントの記述どおりにまとめる。

text の状態 書き方 チェックイン時 チェックアウト時 判断するのは
Set *.txt text 毎回 LF に正規化(以前 CRLF で追加済みでも) eol / 設定 / プラットフォームに従い LF→CRLF になりうる 属性
Unset *.jpg -text 変換しない 変換しない 属性
auto * text=auto Git がテキストと判断し、かつ CRLF で登録済みでなければ変換 同左 Git の判定
Unspecified 何も書かない core.autocrlf に従う core.autocrlf に従う 設定ファイル

text に上記以外の値を書いた場合は「未指定として扱う」とドキュメントにある。

eol 属性は作業ツリー側の改行だけを決める。こちらは text か text=auto が有効なときだけ効くが、eol を書くと text が未指定なら自動的に text が Set になる、とも書かれている。

eol の値 作業ツリーでの改行
crlf チェックアウト時に CRLF へ変換
lf index と同じ改行をそのまま使う
未指定 core.autocrlf か core.eol で決まる。text が Set で両方未設定なら Windows は eol=crlf、それ以外は eol=lf

古い crlf 属性との対応表もドキュメントにそのまま載っている。

crlf text
-crlf -text
crlf=input eol=lf

どちらを使うか

ドキュメントの説明に沿うと、使い分けはこうなる。

自分の作業環境だけ CRLF にしたいなら、属性を使わず core.autocrlf を設定する。ドキュメントは「どのリポジトリでも作業ディレクトリは CRLF にしたいだけなら、属性なしで設定変数を使える」として次を示している。

[core]
 autocrlf = true

ただし「これはテキストファイルの正規化を強制するものではない」と注意書きがある。自分が追加するファイルは LF に正規化され、すでに正規化済みのファイルは正規化されたまま保たれる、という範囲である。

どの貢献者が追加したファイルも正規化したいなら、リポジトリに .gitattributes を置いて * text=auto を書く。これは全員に配られるので、個人の core.autocrlf の違いに左右されない。細かく制御したい場合の例として、ドキュメントは次の設定を挙げている。

* text=auto
*.txt text
*.vcproj text eol=crlf
*.sh text eol=lf
*.jpg -text

.txt、.vcproj、.sh を正規化し、.vcproj は作業ツリーで CRLF、.sh は LF、.jpg は中身にかかわらず正規化しない、という意味になる。「後の行が勝つ」規則があるので、先頭の * text=auto を各行が上書きしている。

既存リポジトリに後から text=auto を入れるときの手順も、ドキュメントに書かれている。

$ echo "* text=auto" >.gitattributes
$ git add --renormalize .
$ git status # Show files that will be normalized
$ git commit -m "Introduce end-of-line normalization"

git status で正規化してはいけないファイルが出てきたら、git add -u の前に manual.pdf -text のように text を Unset する。逆に Git がテキストと見抜けないファイルには weirdchars.txt text と明示できる。

落とし穴

core.autocrlf は属性より弱い。 .gitattributes で -text にしたファイルは、core.autocrlf = true でも変換されない。逆に text が Set なら、ユーザーが core.autocrlf を false にしていても index 側は LF に正規化される。「設定したのに効かない」と感じたら、まず属性が当たっていないかを疑う。

text=auto の判定はファイルごと。 すでに CRLF で Git に登録されているファイルは、text=auto でも変換されない。そのために git add --renormalize の手順が用意されている。

可逆でない変換は core.safecrlf で止められる。 true なら不可逆な変換を拒否し、warn なら警告だけ出して受け付ける。ドキュメントは例外も列挙している。git add 自体は作業ツリーを触らないが次のチェックアウトで触るので安全装置が働く。git apply はテキストファイルの改行を直す操作なので働かない。git diff は作業ツリーを触らないが、問題を早く見つけるために働く。

eol は改行の話であって文字コードの話ではない。 UTF-16 などは Git がバイナリ扱いするため、別の working-tree-encoding 属性がある。ただし「古い Git や JGit、libgit2 などの別実装はこの属性を解釈しない」と明記されており、対応しないクライアントが混ざると *.ps1 のようなファイルが UTF-8 のまま書き出されたり、チェックアウト時の変換が失敗してエラーになったりする、と書かれている。

builtin_ で始まる属性名は予約済み。 ユーザーが定義しても無視され、警告が出る。

自分の環境で確かめる手順

対象ファイルにどの属性がどの状態で当たっているかは、git check-attr で見られる。設定変数側の値は git config で確認する。

git --version
git check-attr text eol -- path/to/file
git config --get core.autocrlf
git config --get core.eol
git config --get core.attributesFile

check-attr の結果が unspecified なら、そのファイルの改行は core.autocrlf と core.eol で決まる。set、unset、auto、crlf、lf のどれかが出ていれば、属性ファイルの側が決めている。どの .gitattributes が効いているかは、対象ファイルのディレクトリから作業ツリーのトップまで順に遡って探せばよい。

文字コードを仕組みから押さえたいとき

改行コードの違いでどんなトラブルが起きるかを、Git の設定より手前から押さえたいときは、『[改訂新版]プログラマのための文字コード技術入門』(技術評論社)が使えます。技術評論社の書籍ページ(取得日 2026-10-21)の目次には「改行コードに起因するトラブル」「1つのファイル中の混在」「改行コードの変換」の節があります。Git の設定は扱っていません。

コメント

タイトルとURLをコピーしました