WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Gitでpullしたときに”warning: CRLF will be replaced by LF in 〜”というWarningが大量に出る

      2015/07/23

発生経緯

標題のような問題が発生した。
経緯としては開発中にGitリポジトリからブランチをpullするときに下記のような事態が起きた。

$ git pull origin master
warning: CRLF will be replaced by LF in model/Users.php.
The file will have its original line endings in your working directory.
...

で、`git status`を見ると大量のdiffが・・・

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   model/User.php
...

Warningメッセージにあるように改行コードCRLFが、ワーキングディレクトリでLFに置き換えられるということが原因らしい。

そういえばこの問題が発生したメンバーはMacやUbuntuなどのUNIX系OSで開発しており、他にWindowsで開発しているメンバーがいる。

gitのcore.autocrlf

gitの設定項目に”core.autocrlf”というものがあるらしい。

自分が Windows で開発していたり、チームの中に Windows で開発している人がいたりといった場合に、改行コードの問題に巻き込まれることがありがちです。Windows ではキャリッジリターンとラインフィードでファイルの改行を表すのですが、Mac や Linux ではラインフィードだけで改行を表すという違いが原因です。ささいな違いではありますが、さまざまなプラットフォームにまたがる作業では非常に面倒なものです。

Git はこの問題に対処するために、コミットする際には行末の CRLF を LF に自動変換し、ファイルシステム上にチェックアウトするときには逆の変換を行うようにすることができます。この機能を使うには core.autocrlf を設定します。Windows で作業をするときにこれを true に設定すると、コードをチェックアウトするときに行末の LF を CRLF に自動変換してくれます。

Git – Git の設定

どうもSourceTreeなどのWindowsのGitツールが、デフォルトでこの値を”true”にしていることが原因みたい。

msysgitにせよSourceTreeにせよ、何故core.autocrlfをデフォルトでtrueに設定しようとしてくれやがるのか。

yuji.develoepr’s graffiti blog: gitのcore.autocrlfなんて滅びればいいのに。

“warning: CRLF will be replaced by LF in model/Users.php.”とあるので、リポジトリにはCRLFで保存されているけどUNIX系OSのローカルでチェックアウトするときにLFになり、それで差分が出てるということかな・・・

実際に下記コマンドでリポジトリにCRLFを含むファイルがないかを見てみると、うじゃうじゃでてきた。

$ git grep --cached -I $'\r'

取った対処法

結論的にうまくいかず。

失敗例

“core.autocrlf”がfalseであることを確認。

$ git config --list | grep -i autocrlf
core.autocrlf=false

これでpullしなおしたら行けると思ったけどそうはいかんかった・・・

$ git reset --hard "pullする前のcommitのSHA1"
$ git pull origin master
同じ結果に・・・

一旦cloneしてしまうと、core.autocrlfを変更しただけだと、ローカルのファイルの改行コードは変更されたままなんですよね。

そういうときはcloneし直すとかしないといけないわけですが、cloneし直さなくても以下のようなコマンドで解決出来ることがわかりました。

$ (git ls-files | xargs -rf) && git reset –hard

yuji.develoepr’s graffiti blog: gitのcore.autocrlfなんて滅びればいいのに。

なるほど、cloneしなおしが必要らしい・・・
そこで設定ファイルのバックアップ、まだプロダクションブランチにマージしていないコミットを含んだブランチをリモートに避難して`git clone`実行。
しかしこちらもうまくいきませんでした。

妥協案

Windowsを使っている開発者には”core.autocrlf”を”false”にしてもらう(ただ今回はfalseになっているとのことだった・・・)。

$ git config --global core.autocrlf false

CRLFをLFに置換したコミットをする。

今後改行コードをLFで統一する。

で対応。

 - Git , , ,