- Git
Git改行コード設定|autocrlfと.gitattributesの違い
core.autocrlf は「自分のパソコンの Git」に対する改行変換の設定、.gitattributes は「リポジトリに入れて全員で共有する」改行変換の設定です。 両方があるときは .gitattributes の eol 指定が優先されるので、チームで改行コードをそろえたいなら .gitattributes に書くのが近道です。
この記事では、autocrlf(true / input / false)× .gitattributes(指定なし / text=auto / eol=lf / eol=crlf / -text)の全組み合わせで、コミット時とチェックアウト時に改行がどうなるかを実際に確かめて早見表にしました。あわせて 「LF will be replaced by CRLF」警告を再現して意味を読み解き、git ls-files --eol と git add --renormalize で既存リポジトリを直す手順を実行結果つきで示します。OS 別の推奨設定と、コピペで使える .gitattributes のひな形も載せています。
実行環境は Ubuntu 24.04 LTS、Git 2.43.0 です。Linux 上で設定を切り替えて結果を取っているため、Windows・macOS の実機では未実行です。属性の仕様は Git 公式ドキュメントの gitattributes のページを今回開いて確認しました。
改行コード設定の早見表
autocrlf × .gitattributes の組み合わせ
LF のファイルと CRLF のファイルを新しく git add してコミットし、いったん削除してからチェックアウトし直した結果です。「リポジトリ」はコミットされた中身、「作業ツリー」はチェックアウト後の手元のファイルを指します。
| .gitattributes の指定 | autocrlf=true | autocrlf=input | autocrlf=false |
|---|---|---|---|
| 指定なし | リポジトリ LF / 作業ツリー CRLF | リポジトリ LF / 作業ツリー LF | 変換なし(LF は LF、CRLF は CRLF のまま) |
* text=auto |
リポジトリ LF / 作業ツリー CRLF | リポジトリ LF / 作業ツリー LF | リポジトリ LF / 作業ツリーは OS の既定(Linux・macOS は LF、Windows は CRLF) |
* text |
同上 | 同上 | 同上 |
* text=auto eol=lf(eol=lf だけでも同じ) |
リポジトリ LF / 作業ツリー LF | リポジトリ LF / 作業ツリー LF | リポジトリ LF / 作業ツリー LF |
* text=auto eol=crlf(eol=crlf だけでも同じ) |
リポジトリ LF / 作業ツリー CRLF | リポジトリ LF / 作業ツリー CRLF | リポジトリ LF / 作業ツリー CRLF |
* -text |
変換なし | 変換なし | 変換なし |
表から読み取れる要点は3つです。
eol=lf・eol=crlf・-textを書いた行は、autocrlf が何であっても同じ結果になります。個人の設定の違いを吸収できるのは、この3つです。text=autoだけ(eol なし)の行は、autocrlf や OS によって作業ツリーの改行が変わります。- どの組み合わせでも、テキストとして扱われたファイルの リポジトリ側は LF にそろいます(変換なしの行を除く)。
3つの設定の役割
| 設定 | 書く場所 | 影響する範囲 | 役割 |
|---|---|---|---|
core.autocrlf |
各自の Git 設定(git config) |
そのパソコンだけ | .gitattributes に指定がないファイルの変換を決める |
core.eol |
各自の Git 設定 | そのパソコンだけ | text 指定のファイルを作業ツリーでどの改行にするか(autocrlf が false のときに効く) |
.gitattributes |
リポジトリの中のファイル | クローンした全員 | ファイルの種類ごとに変換の有無と改行を決める |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Git改行コード設定|autocrlfと.gitattributesの違い」
改行コードと Git の変換のしくみ
改行コードには主に2種類あります。
| 名前 | 中身 | 主に使われる環境 |
|---|---|---|
| LF | \n(1バイト) |
Linux、macOS、WSL2 |
| CRLF | \r\n(2バイト) |
Windows |
同じリポジトリを Windows と macOS・Linux で一緒に使うと、エディタの設定しだいで改行コードが混ざります。改行だけが違うファイルは、中身を変えていないのに全行が変更として表示されます。
git diff --stat
git diff | cat -A | tail -5
f.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
@@ -1,2 +1,2 @@$
-a$
-b$
+a^M$
+b^M$
^M が CR(\r)です。2行のファイルの改行を CRLF に変えただけで、2行とも変更あつかいになりました。
Git の改行変換は、次の2つのタイミングで働きます。
flowchart LR
W[作業ツリー<br>手元のファイル] -- "git add(コミット時)<br>CRLF を LF に変換" --> I[インデックス/リポジトリ]
I -- "git checkout(チェックアウト時)<br>LF を CRLF に変換、または変換なし" --> W
リポジトリの中は LF にそろえ、作業ツリーに取り出すときに必要なら CRLF にする、というのが Git の考え方です。autocrlf と .gitattributes は、この2つの変換を「するか・しないか」「どちらの改行にするか」を決めています。
core.autocrlf の3つの値
git config --global core.autocrlf true # または input / false
git config --show-origin --get core.autocrlf
git config --list --show-scope | grep -i crlf
file:.git/config false
local core.autocrlf=false
--show-origin と --show-scope を付けると、どのファイル・どの範囲(system / global / local)で設定されているかがわかります。意図と違う値になっているときに役立ちます。
| 値 | コミット時(git add) | チェックアウト時 | 向いている環境 |
|---|---|---|---|
true |
CRLF → LF | LF → CRLF | Windows で、手元は CRLF で扱いたい |
input |
CRLF → LF | 変換なし | macOS・Linux・WSL2 |
false |
変換なし | 変換なし | 変換を .gitattributes にまかせたい、または一切変換したくない |
実際に確かめた結果です(.gitattributes なし)。
| autocrlf | LF で作ったファイル | CRLF で作ったファイル |
|---|---|---|
| true | リポジトリ LF / 作業ツリー CRLF | リポジトリ LF / 作業ツリー CRLF |
| input | リポジトリ LF / 作業ツリー LF | リポジトリ LF / 作業ツリー LF |
| false | リポジトリ LF / 作業ツリー LF | リポジトリ CRLF / 作業ツリー CRLF |
false のときだけ、CRLF がそのままリポジトリに入ります。 全員が false で、エディタの改行設定がそろっていない場合に、改行が混ざりやすくなります。
「LF will be replaced by CRLF」警告を再現する
警告が出る条件
core.autocrlf=true の状態で、LF のファイルを git add すると表示されます。
printf 'line1\nline2\n' > lf.txt # LF のファイル
printf 'line1\r\nline2\r\n' > crlf.txt # CRLF のファイル
printf 'a\r\nb\n' > mixed.txt # 混在
git config core.autocrlf true
git add lf.txt
git add crlf.txt mixed.txt
warning: in the working copy of 'lf.txt', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'mixed.txt', LF will be replaced by CRLF the next time Git touches it
CRLF だけの crlf.txt には警告が出ず、LF を含む2つのファイルに出ています。
警告の意味
「手元のこのファイルは今 LF だが、次に Git がこのファイルを書き出すとき(チェックアウトなど)には CRLF になる」 というお知らせです。エラーではなく、git add は完了しています。リポジトリの中身が変わるわけでもありません。
直後の状態を git ls-files --eol で見ると、警告の内容がそのまま読み取れます。
git ls-files --eol
i/lf w/crlf attr/ crlf.txt
i/-text w/-text attr/ data.bin
i/lf w/lf attr/ lf.txt
i/lf w/mixed attr/ mixed.txt
lf.txt はリポジトリ側(i/)も作業ツリー側(w/)も LF です。コミットしてからチェックアウトし直すと、こう変わります。
git commit -qm init
rm lf.txt crlf.txt mixed.txt
git checkout -- .
git ls-files --eol
i/lf w/crlf attr/ crlf.txt
i/-text w/-text attr/ data.bin
i/lf w/crlf attr/ lf.txt
i/lf w/crlf attr/ mixed.txt
警告のとおり、作業ツリーの lf.txt と mixed.txt が CRLF に変わりました。 バイナリの data.bin は -text と判定され、変換の対象外です。
逆向きの警告「CRLF will be replaced by LF」
core.autocrlf=input の状態で CRLF のファイルを追加すると、逆向きの警告になります。
git config core.autocrlf input
printf 'x\r\ny\r\n' > new_crlf.txt
git add new_crlf.txt
git ls-files --eol new_crlf.txt
warning: in the working copy of 'new_crlf.txt', CRLF will be replaced by LF the next time Git touches it
i/lf w/crlf attr/ new_crlf.txt
リポジトリには LF で入り、手元のファイルは CRLF のままです。次にチェックアウトされると LF になります。
警告への対応の選び方
| 状況 | 対応 |
|---|---|
| 手元が CRLF になってよい(Windows のエディタで扱う) | そのままでよい。警告は確認用のお知らせ |
| 手元も LF のままにしたい | .gitattributes に * text=auto eol=lf を書く(autocrlf より優先される) |
| 自分のパソコンだけ変えたい | git config --global core.autocrlf input |
| 警告を止めたいだけ | git config --global core.safecrlf false(変換は行われる) |
| 変換が起きるなら追加を止めたい | git config --global core.safecrlf true |
core.safecrlf の動きも確かめました。
# autocrlf=input の状態で CRLF のファイルを追加
git -c core.safecrlf=true add new2.txt; echo "rc=$?"
git -c core.safecrlf=false add new2.txt; echo "rc=$?"
fatal: CRLF would be replaced by LF in new2.txt
rc=128
rc=0
safecrlf=true は警告を「追加を止めるエラー」に変え、false は警告を表示しなくなります。 既定は警告の表示です。Git 2.43.0 の文面は上のとおりですが、版によって警告の言い回しが異なることがあります。
git ls-files --eol の読み方
改行コードの状態を一覧できるコマンドです。直す前の調査と、直した後の確認の両方に使います。
i/lf w/crlf attr/text=auto eol=lf src/app.js
| 列 | 意味 |
|---|---|
i/... |
インデックス(リポジトリに入る中身)の改行 |
w/... |
作業ツリー(手元のファイル)の改行 |
attr/... |
そのファイルに効いている .gitattributes の属性 |
| 最後の列 | ファイルのパス |
| 値 | 意味 |
|---|---|
lf |
LF だけ |
crlf |
CRLF だけ |
mixed |
LF と CRLF が混在 |
-text |
バイナリと判定された |
none |
改行を含まない(空のファイルなど) |
リポジトリに CRLF や混在が入っているファイルだけを抜き出すには、grep と組み合わせます。
git ls-files --eol | grep -E '^i/(crlf|mixed)'
属性がどう解釈されたかは git check-attr で確かめられます。
git check-attr text eol -- src/app.js scripts/build.bat logo.png
src/app.js: text: auto
src/app.js: eol: lf
scripts/build.bat: text: set
scripts/build.bat: eol: crlf
logo.png: text: unset
logo.png: eol: lf
logo.png には eol: lf も表示されていますが、text が unset(-text)なので変換は行われません。
.gitattributes の書き方
属性の一覧
| 書き方 | 意味 |
|---|---|
* text=auto |
Git がテキストと判定したファイルだけ変換する。バイナリは対象外 |
*.md text |
必ずテキストとして変換する |
*.sh text eol=lf |
テキストとして扱い、作業ツリーでも必ず LF |
*.bat text eol=crlf |
テキストとして扱い、作業ツリーでは必ず CRLF |
*.png -text |
改行変換をしない |
*.png binary |
-text -diff -merge をまとめた指定。変換も差分表示もしない |
書き方のきまりは次のとおりです。
- 1行に「パターン 属性 属性 ...」を書きます。パターンの書き方は .gitignore とほぼ同じです。
- 同じファイルに複数の行が当てはまるときは、後ろの行が優先されます。全体の既定を先頭に、個別の指定を後ろに書きます。
eolを書くと、textを書かなくてもテキストとして扱われます(公式ドキュメントの記述どおり、eol=lfだけの行もtext eol=lfと同じ結果になりました)。
eol なしの text=auto は OS の既定に従う
* text=auto だけを書き、core.autocrlf=false にしたうえで core.eol を切り替えた結果です。
| 設定 | LF で作ったファイルのチェックアウト後 |
|---|---|
core.eol=lf |
作業ツリー LF |
core.eol=crlf |
作業ツリー CRLF |
core.eol=native(Linux で実行) |
作業ツリー LF |
core.autocrlf=true と core.eol=lf の両方 |
作業ツリー CRLF(autocrlf が優先) |
core.eol の既定は native(OS に合わせる)で、Windows では CRLF になります。公式ドキュメントにも「text が設定されていて autocrlf も core.eol も設定されていない場合、Windows では eol=crlf、それ以外では eol=lf が既定」と書かれています。全員の手元を同じ改行にしたいなら、eol=lf まで書くのが確実です。
コピペ用 .gitattributes ひな形
リポジトリの一番上に置きます。
# 既定: テキストと判定したものは LF で保存し、作業ツリーも LF
* text=auto eol=lf
# Windows 専用のスクリプトは CRLF で取り出す
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf
# シェルスクリプトは必ず LF
*.sh text eol=lf
# バイナリは変換しない
*.png binary
*.jpg binary
*.pdf binary
*.zip binary
このひな形で、属性が意図どおりに付くことを確かめました。
git check-attr text eol diff -- a.sh b.bat c.png d.md
a.sh: text: set
a.sh: eol: lf
a.sh: diff: unspecified
b.bat: text: set
b.bat: eol: crlf
b.bat: diff: unspecified
c.png: text: unset
c.png: eol: lf
c.png: diff: unset
d.md: text: auto
d.md: eol: lf
d.md: diff: unspecified
手元も Windows の改行で扱いたいチーム向けには、1行目を次のように変えます。
# リポジトリは LF、作業ツリーは各自の OS に合わせる
* text=auto
既存リポジトリを git add --renormalize で直す
すでに CRLF が混ざったリポジトリを、LF にそろえる手順です。.gitattributes を追加しただけでは、すでにコミットされているファイルの中身は変わりません。 git add --renormalize で、現在の設定に合わせて入れ直します。
手順1:現状を調べる
CRLF・混在・LF・バイナリが混ざったリポジトリを用意しました(core.autocrlf=false)。
git ls-files --eol
i/-text w/-text attr/ logo.png
i/crlf w/crlf attr/ scripts/build.bat
i/crlf w/crlf attr/ scripts/build.sh
i/crlf w/crlf attr/ src/app.js
i/mixed w/mixed attr/ src/mixed.md
i/lf w/lf attr/ src/style.css
リポジトリ側(i/)に crlf が3つ、mixed が1つあります。
手順2:.gitattributes を置く
cat .gitattributes
git status --short
* text=auto eol=lf
*.bat text eol=crlf
*.png binary
M scripts/build.bat
?? .gitattributes
.gitattributes を置いただけで、build.bat が「変更あり」と表示されました。属性が付いたことで、「リポジトリ側は LF であるべきなのに CRLF が入っている」と Git が判断したためです。ほかのファイルは、次の手順で入れ直すまで変化がありません。
手順3:renormalize を実行する
作業ツリーに未コミットの変更がない状態で実行します。
git add --renormalize .
git status --short
git diff --cached --stat
M scripts/build.bat
M scripts/build.sh
M src/app.js
M src/mixed.md
?? .gitattributes
scripts/build.bat | 4 ++--
scripts/build.sh | 4 ++--
src/app.js | 4 ++--
src/mixed.md | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
CRLF が入っていた4ファイルだけがステージされました。もともと LF だった style.css とバイナリの logo.png は対象になっていません。
手順4:コミットして確認する
git add .gitattributes
git commit -m "Normalize line endings"
git ls-files --eol
i/lf w/lf attr/text=auto eol=lf .gitattributes
i/-text w/-text attr/-text logo.png
i/lf w/crlf attr/text eol=crlf scripts/build.bat
i/lf w/crlf attr/text=auto eol=lf scripts/build.sh
i/lf w/crlf attr/text=auto eol=lf src/app.js
i/lf w/mixed attr/text=auto eol=lf src/mixed.md
i/lf w/lf attr/text=auto eol=lf src/style.css
リポジトリ側(i/)はすべて LF になりました。一方、作業ツリー側(w/)にはまだ CRLF が残っています。renormalize が書き換えるのはインデックスだけで、手元のファイルはそのままだからです。
手順5:作業ツリーを取り出し直す
git rm -q --cached -r .
git reset -q --hard
git ls-files --eol
i/lf w/lf attr/text=auto eol=lf .gitattributes
i/-text w/-text attr/-text logo.png
i/lf w/crlf attr/text eol=crlf scripts/build.bat
i/lf w/lf attr/text=auto eol=lf scripts/build.sh
i/lf w/lf attr/text=auto eol=lf src/app.js
i/lf w/lf attr/text=auto eol=lf src/mixed.md
i/lf w/lf attr/text=auto eol=lf src/style.css
作業ツリーも、build.bat だけ CRLF、ほかは LF という .gitattributes どおりの状態になりました。git reset --hard は未コミットの変更を取り消すコマンドなので、必ずコミット済みの状態で実行してください。新しくクローンし直す方法でも同じ結果になります。
text=auto はコミット済みの CRLF をそのまま保つ
text=auto には「すでに CRLF でコミットされているファイルは変換しない」というきまりがあります。確かめた結果です。
# old.txt は CRLF でコミット済み。.gitattributes に "* text=auto" を追加後、
# old.txt を編集し、new.txt(CRLF)を新しく作って git add
git add . ; git ls-files --eol
warning: in the working copy of 'new.txt', CRLF will be replaced by LF the next time Git touches it
i/lf w/lf attr/text=auto .gitattributes
i/lf w/crlf attr/text=auto new.txt
i/crlf w/crlf attr/text=auto old.txt
新しい new.txt は LF に変換されましたが、コミット済みだった old.txt は、編集して add しても CRLF のままです。ここで renormalize を実行すると LF にそろいます。
git add --renormalize . ; git ls-files --eol
i/lf w/lf attr/text=auto .gitattributes
i/lf w/crlf attr/text=auto new.txt
i/lf w/crlf attr/text=auto old.txt
「.gitattributes を入れたのに直らない」と感じたときは、このきまりが働いています。導入のときに一度 renormalize する、と覚えておくとすっきりします。
直した後の差分と blame の見え方
改行だけを直したコミットは、行数ぶんの変更として記録されます。レビューや履歴の調査では、次のオプションが役立ちます。
git diff HEAD~1 --stat -- src/app.js
git diff HEAD~1 --stat --ignore-cr-at-eol -- src/app.js
src/app.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--ignore-cr-at-eol を付けた2つ目は何も表示されず、改行以外の変更がないことを確かめられます。
git blame は、そのままだと全行が「Normalize line endings」のコミットを指しますが、-w を付けると元のコミットをたどれました。
| コマンド | 1行目が指したコミット |
|---|---|
git blame src/app.js |
Normalize line endings |
git blame -w src/app.js |
initial (CRLF mixed in) |
renormalize の手順まとめ
| 順番 | コマンド | 目的 |
|---|---|---|
| 1 | git status |
未コミットの変更がないことを確認する |
| 2 | git ls-files --eol |
現状を調べる |
| 3 | .gitattributes を作成 | ルールを決める |
| 4 | git add --renormalize . |
現在のルールでインデックスを入れ直す |
| 5 | git status、git diff --cached --stat |
対象のファイルを確認する |
| 6 | git add .gitattributes && git commit |
改行の修正だけを1つのコミットにする |
| 7 | 取り出し直し、またはクローンし直し | 作業ツリーにも反映する |
| 8 | git ls-files --eol |
結果を確認する |
改行の修正は、機能の変更と分けて単独のコミットにすると、あとから差分を読みやすくなります。ほかの人が作業中のブランチとは、この修正を取り込んだあとに改行の差で競合が出ることがあるので、実施のタイミングをチームで共有しておくとスムーズです。
Windows・WSL2・macOS 別の推奨設定
この節の OS 別の設定は、Windows・macOS の実機では未実行です。上の早見表(Linux 上で設定を切り替えて確認した結果)と公式ドキュメントの記述をもとに整理しています。
リポジトリに .gitattributes がある場合(おすすめ)
* text=auto eol=lf のように eol まで書いてあれば、個人の autocrlf の値に関係なく同じ結果になります。早見表のとおり、true・input・false のどれでも、リポジトリ LF・作業ツリー LF でした。
リポジトリに .gitattributes がない場合
| 環境 | 推奨する設定 | コマンド | 結果 |
|---|---|---|---|
| Windows(Git for Windows) | true | git config --global core.autocrlf true |
リポジトリ LF、手元 CRLF |
| Windows で手元も LF にしたい | input | git config --global core.autocrlf input |
リポジトリ LF、手元は変換なし |
| WSL2(Linux 側の Git) | input | git config --global core.autocrlf input |
リポジトリ LF、手元は変換なし |
| macOS | input | git config --global core.autocrlf input |
リポジトリ LF、手元は変換なし |
| Linux | input | git config --global core.autocrlf input |
リポジトリ LF、手元は変換なし |
どの環境でも コミット時に CRLF が LF になる設定なので、リポジトリには LF だけが入ります。
WSL2 を使うときのポイント
- WSL2 の中の Git と Windows 側の Git は、設定ファイルが別々です。それぞれで
git config --globalを設定します。 - 同じ作業ツリーを Windows 側の Git(autocrlf=true)と WSL2 側の Git(autocrlf=input)の両方から操作すると、手元の改行の解釈が変わり、変更していないファイルに差分が出ることがあります。どちらか一方の Git で操作すると決めておくと安定します。
eol=lfを書いた .gitattributes があれば、どちらの Git から操作しても作業ツリーは LF になります。
エディタ側もそろえる
Git の設定に加えて、エディタが新しいファイルを作るときの改行もそろえておくと、警告を見る機会が減ります。EditorConfig に対応したエディタなら、リポジトリに次のファイルを置く方法があります(エディタの動作は未実行です)。
# .editorconfig
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.{bat,cmd,ps1}]
end_of_line = crlf
改行コードが原因のエラーと直し方
シェルスクリプトが起動しない
1行目(シバン)の末尾に CR が付いていると、インタープリタの名前が /bin/bash\r と解釈されます。
printf '#!/bin/bash\r\necho hi\r\n' > x.sh
chmod +x x.sh
./x.sh
./x.sh: cannot execute: required file not found
ファイル自体は存在するのに「required file not found」と表示されるのが特徴です(bash 5.2 での表示。行頭には呼び出し元の名前と行番号が付きます)。
CR が入っているかを調べて取り除く
file f.txt
grep -c $'\r' f.txt
sed -i "s/\r$//" f.txt
file f.txt
f.txt: ASCII text, with CRLF line terminators
2
f.txt: ASCII text
file コマンドは「with CRLF line terminators」と表示し、grep -c $'\r' は CR を含む行数を返します。sed -i "s/\r$//" で行末の CR を取り除けます。根本的には、*.sh text eol=lf を .gitattributes に書いておくと、どの OS でチェックアウトしても LF になります。
症状から引く対応表
| 症状 | 原因 | 対応 |
|---|---|---|
LF will be replaced by CRLF と表示される |
autocrlf=true で LF のファイルを add した | そのままでよい。手元も LF にしたいなら eol=lf を書く |
CRLF will be replaced by LF と表示される |
autocrlf=input や text 指定で CRLF のファイルを add した | そのままでよい。リポジトリには LF で入る |
fatal: CRLF would be replaced by LF で add できない |
core.safecrlf=true |
ファイルの改行を直すか、safecrlf を見直す |
| 変更していないのに全行が差分になる | 改行コードが変わった | git diff --ignore-cr-at-eol で確認し、.gitattributes と renormalize でそろえる |
| .gitattributes を入れたのに CRLF のまま | text=auto はコミット済みの CRLF を保つ |
git add --renormalize . を実行する |
シェルスクリプトが required file not found |
シバンの行末に CR | *.sh text eol=lf を書いて取り出し直す |
| .bat が LF になって動きが変わる | 既定の eol=lf が当たっている |
*.bat text eol=crlf を後ろの行に書く |
| 画像が壊れる | テキストとして変換された | *.png binary を書く |
よくある質問
Q. autocrlf と .gitattributes は、どちらが優先されますか?
A. .gitattributes に eol=lf や eol=crlf、-text が書かれているファイルは、autocrlf の値に関係なくその指定どおりになります。本文の早見表のとおり、true・input・false のすべてで同じ結果でした。text=auto だけで eol がない場合は、作業ツリーの改行が autocrlf と core.eol、OS の既定で決まります。
Q. 「LF will be replaced by CRLF」は直さないといけませんか?
A. エラーではなく、次のチェックアウトで手元のファイルが CRLF になることを知らせる表示です。git add は完了していて、リポジトリには LF で入ります。手元も LF のままにしたい場合は、.gitattributes に * text=auto eol=lf を書くと表示されなくなります。
Q. git add --renormalize を実行すると、履歴はどうなりますか?
A. 過去のコミットは書き換わりません。現在のファイルを LF に入れ直す新しいコミットが1つ増えます。改行だけの差分は git diff --ignore-cr-at-eol で除外でき、git blame -w で元のコミットをたどれます。
Q. core.autocrlf は false にしておくほうがよいですか?
A. リポジトリに eol つきの .gitattributes があるなら、false でも結果は同じです。.gitattributes がないリポジトリで false にすると変換が一切行われないので、CRLF がそのままコミットされます。その場合は Windows なら true、macOS・Linux・WSL2 なら input が扱いやすい設定です。
まとめ
- autocrlf は個人の設定、.gitattributes はリポジトリで共有する設定。
eolを書いた .gitattributes は autocrlf より優先される * text=auto eol=lfを書くと、autocrlf が true・input・false のどれでもリポジトリ LF・作業ツリー LF になる- 「LF will be replaced by CRLF」はエラーではなく、次のチェックアウトで手元が CRLF になるというお知らせ
git ls-files --eolの i/ はリポジトリ、w/ は作業ツリー、attr/ は効いている属性- 既存リポジトリは
git add --renormalize .で入れ直す。text=autoはコミット済みの CRLF を保つため、導入時に一度実行する - renormalize のあと、作業ツリーは取り出し直すまで元の改行のまま
- .bat は
eol=crlf、.sh はeol=lf、画像はbinaryと個別に指定する
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Git改行コード設定|autocrlfと.gitattributesの違い」
株式会社RJCでは、Gitの設定やチーム開発での使い方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。