はじめに
このタイトルにあるような内容は
git windows 改行コード
などと検索すればたくさんでてくることと思われます。
git for windowsでデフォルトの設定でインストールした場合、

Checkout Windows-style, commit Unix-style line endings
の設定となり、チェックアウトの際の改行コードがLFからCRLFにしてしまう設定です。
gitの設定をgit config -lでみるとcore.autocrlf=trueとなっているかと思われます。
他の方の記事を読むと、その設定が煩わしいというようなことが書かれています。
確かに。
インストール後に変更する場合は、
git config --global core.autocrlf trueのtrueを変えることで変更が可能です。
| 設定 | チェックアウト時 | コミット時 |
|---|---|---|
| true | LF -> CRLF | CRLF -> LF |
| input | 変換しない | CRLF -> LF |
| false | 変換しない | 変換しない |
これをみるとinputやfalseはLF -> CRLFの自動変換を行わないので、これらを選んでしまいそうですが、
大規模開発で多数の開発者がtrueでインストールしてしまった場合、わざわざ変更をしてもらうまでの悪影響があるのか?がわからなかったので、それについて調べた結果を記載しようかと思います。また、これを書くきっかけとなった私のチームではまった落とし穴について書こうと思います。
core.autocrlfをtrueに設定をした場合
core.autocrlfをtrueに設定をした場合について整理します。
チェックアウトやコミットした場合の動きや、開発者がCRLFでファイルを作成した場合の動きは以下のようになります。
上記の図から確かにwroking directory上ではCRLFとLFが混在してしまう可能性がありますが、
repository上のファイルがLFである以上、core.autocrlfをtrueに設定をしていても問題がないように思えます。
問題となる設定
では、repositoryにCRLFが紛れてしまう恐れがある設定は何でしょうか。
それはcore.autocrlfがfalseの場合です。
core.autocrlfをfalseにするということはチェックアウト時もコミット時も改行コードを変換しないということです。
そうした場合、以下のようなことになります。
これではリモートリポジトリにもCRLFが紛れてしまい、他開発者にも影響がでてしまいます。
つまり、core.autocrlfは以下のどちらかがよいように思われます。
trueinput
ただもう一つ落とし穴が
ここで、もう一つ気をつけることがあります。実際、この落とし穴にはまったためこの記事を書こうと思いました。
それは、core.autocrlfをtrueにしていたことが原因でした。
注意が必要なのはMavenやGradleを利用してビルドを行う、ビルド職人たちです。
ビルド職人がcore.autocrlfをtrueでチェックアウトし、ローカルのworking directoryでwindows以外のデプロイ資材を作成してしまうと
以下が示すように、資材の中にCRLFが含まれてしまう可能性があります。
シェルなどがCRLFとなってLinux環境に置かれた場合、大変恥ずかしいことになってしまいますね。
・・・。
ここまでのまとめ
windows環境で開発を行っている開発者は
git config --global core.autocrlf true
または
git config --global core.autocrlf input
にしておけば問題ないように思われますが、
ビルド作業のことや、想定していない改行コードの不具合を出さないようにするには
git config --global core.autocrlf input
としておいた方がよいのではないでしょうか。
Repository上のCRLFをLFに変換する方法
さて、falseにしていて、CRLFのファイルをrepository上に作成してしまった場合はLFに変換してあげなければなりません。
調査中、以下の記事が親切丁寧にまとめていてくださいました。
http://tech.nitoyon.com/ja/blog/2014/03/28/git-crlf-to-lf/
まんまなので、そんなに書きません。備忘用です。
- Repository上に
CRLFがあるかどうかは以下のコマンドで。
git grep --cached -I $'\r' - repositoryの改行コードをなにもせずにもってきたいので、以下の設定にします。
git config --global core.autocrlf input - 修正したいのはrepository内の
CRLFです。working directoryと同期をとるために削除してからcheckoutします。(ここは「勘違い」で説明します。) - エディタで
CRLF -> LFの修正
私はIntellij IDEAなので、以下の記事を参考に。
http://qiita.com/tanakahisateru/items/1c9ddf8d33d6727269ec - コミット
勘違い
私がしていた勘違いです。
git config core.autocrlf trueの設定で、CRLFがworkingディレクトリにあるとわかったとき、エディタでCRLF -> LFを修正して、コミットを行ったのですが、コミットした履歴がログに出てこず、困ってしましました。
しかし、よくよく整理をしてみると、working directoryがCRLFだったとしても、repositoryが
LFであった場合、改行コードだけの修正であれば内容に差はなく、ヒストリーは残らないということがわかりました。
なので、repositoryの改行をそのままにするinputやfalseの設定にしておいてから、working directoryにチェックアウトをしてあげる必要があるようです。
※ただ、その際、working directoryを一度削除しないと、同期が取れないようです。


