はじめに
このタイトルにあるような内容は
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
は以下のどちらかがよいように思われます。
true
input
ただもう一つ落とし穴が
ここで、もう一つ気をつけることがあります。実際、この落とし穴にはまったためこの記事を書こうと思いました。
それは、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を一度削除しないと、同期が取れないようです。