Qiitaへの初投稿がこんなものでよいか分からないけど、どこに記録しておくのがよいかわからなかったので記しておきます。
改行コードの自動変換に関する config のおさらい
最重要なのは core.autocrlf
と core.eol
の2つ。core.safecrlf
についてはここでは触れない。
あとリポジトリに .gitattributes
があればその設定が優先されるけど、それについてもここでは略。
core.autocrlf
チェックイン/チェックアウト時にテキストファイルの改行コードを自動変換するか否かを制御する全体設定。
取りうる値は true
, false
, input
の3つ。明示的に設定されていない場合は false
となる。
値 | チェックイン時 | チェックアウト時 | 補足 |
---|---|---|---|
true | 常にLFにしてリポジトリに格納する | 常にCRLFにする | |
input | 常にLFにしてリポジトリに格納する | 何もしない(そのまま) | 「リポジトリへのinput」と理解すればOK1 |
false | 何もしない(そのまま) |
core.eol に従う |
core.eol
作業領域で使う改行コードを設定する。core.autocrlf=false
のときにのみ有効。
取りうる値は native
, lf
, crlf
の3つ。明示的に設定されていない場合は native
となる。
この設定により、core.autocrlf=false
でも結果的にチェックアウト時の改行コードの自動変換が働く。一方、チェックイン時には影響しない(何もしない)。
値 | チェックアウト時 |
---|---|
native | OS の標準の改行コード |
crlf | CRLF |
lf | LF |
Pro Git での core.autocrlf=input の説明
上述のとおり core.autocrlf=input
の意味は「チェックイン時はtrueと同じ、チェックアウト時は何もしない」であって、OSによって挙動が変わるような設定項目ではない。しかし Pro Git の 「Git の設定」節では以下のように説明されている。
この設定は、Windows にチェックアウトしたときの CRLF への変換は行いますが、Mac や Linux へのチェックアウト時は LF のままにします。
誤訳かと思ったら英語版でもこう書かれている。
This setup should leave you with CRLF endings in Windows checkouts, but LF endings on macOS and Linux systems and in the repository.
この説明は混乱を招いていると思う。いろいろなサイトでこの説明が引用されているので困ったもの。
issueでもこのことが指摘されていたが、修正はされていない模様。
# エンジニアたるもの、間違っていると思ったなら issue 立てるなり Pull Request 投げるなりするべきだが、ちょっとそこまでの余裕が今はない。すみません。
-
StackOverflowでのQ&Aによると、ファイルが working-tree から index にコピーされる際に行われる自動変換が "input conversion" とのこと。 ↩