Windows & WSL 環境で git を叩く場合の改行コード設定
git config --global core.autocrlf=auto
で全て解決するかと思えばそうでもなかった。
Symptom
- WSL環境を利用している
- gitコマンドとgitリポジトリはWSL上のLinux環境下に配置したものを利用する
- エディタは
\\wsl$\
パス経由でWindowsのものを利用している - gitリポジトリ内のファイルはLFに統一したい
当初は core.autocrlf=true
さえ設定していれば問題ないかと思ったが、上記の環境ではリポジトリ内にCRLFのファイルが混入してしまった。まあ稀にWindowsからGitクライアントを叩いたりしていたし、そんなガッチャガチャの使い方をしているのが悪いと思うのだが......
とりあえずバイナリ以外の改行コードは明示的にLFに変換したほうが誤りが少ないし、また Windows と WSL を行き来するのなら、ワーキングツリー上の改行コードもLFに統一しておきたい。ということで、設定を調整していく。
Resolution
手元の端末の改行コードをリポジトリに持ち込まないよう、WSLとWIndowsのgitに対して以下の設定を施す。
-
ワーキングツリーの改行コードをLFとする
https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreeolgit config --global core.eol lf
-
リポジトリへの書き込み時のみ改行コードを(LFへ)変換する
https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreautocrlfgit config --global core.autocrlf input
当然エディタについても、新規作成するファイルがLFになるよう設定する。またもしワーキングツリーにCRLFのファイルが存在するのなら、LFに変換しておく。これらの設定を施した上で、リポジトリのファイルがLFに統一されていれば、これで想定どおりの挙動になるはずだ(チェックインするファイルはLFに変換され、チェックアウトしたファイルはLFのまま書き出される)。
Appendix
git pull での予期しない Merge Commit を防止する
(大抵そうだと思うのだが)私の場合、 git pull はローカルブランチに対して origin 側ブランチの更新を同期する場合に利用する。このタイミングで意図せず歴史の食い違いが生じていた場合、デフォルトでは自動的にMergeを試みる。これを防ぐため、git pull では Fast-Foward Merge のみ許すよう設定する。
Merge Commitは適切なタイミングで実施されるべきだ。仮にMergeが必要であっても、根拠のないタイミングでMergeするべきではない。
git pull
の実行時に--ff-only
を強制させる
git config --global pull.ff only
git merge にデフォルトで Merge Commit を作成させる
一方で異なるブランチ間のマージについては、私は常にマージコミットを作成している。この際に誤って Fast-Forward Merge することがないよう設定する。
git merge
は--no-ff
をデフォルトにする
git config --global merge.ff
しかしMac OSはずっとCRなもんだと思っていたら、いつのまにか LF になっていたし名前はmacOSに変わっていた。時代か......