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になるよう設定する。またもしワーキングツリーに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に変わっていた。時代か......