by shigemk2

当面は技術的なことしか書かない

Gitのautocrlfについて

概要

開発環境によってOSが違うと、文字コードとか改行コードとかの違いに悩まされることがある。

1行しか追加していないのにコミットしたらファイルがまるっと置き換わってて トピックブランチをmergeしようとしたら盛大にコンフリクトを起こすということはままある。

エディタでの改行コードの設定は完璧なのにもかかわらず、だ。

そういうときは、gitのautocrlfの設定を疑ったほうがいい。というかむしろ、疑え。

core.autocrlf

自分が Windows で開発していたり、チームの中に Windows で開発している人がいたりといった場合に、改行コードの問題に巻き込まれることがありがちです。Windows ではキャリッジリターンとラインフィードでファイルの改行を表すのですが、Mac や Linux ではラインフィードだけで改行を表すという違いが原因です。ささいな違いではありますが、さまざまなプラットフォームにまたがる作業では非常に面倒なものです。
Git はこの問題に対処するために、コミットする際には行末の CRLF を LF に自動変換し、ファイルシステム上にチェックアウトするときには逆の変換を行うようにすることができます。この機能を使うには core.autocrlf を設定します。Windows で作業をするときにこれを true に設定すると、コードをチェックアウトするときに行末の LF を CRLF に自動変換してくれます。

$ git config --global core.autocrlf true

Linux や Mac などの行末に LF を使うシステムで作業をしている場合は、Git にチェックアウト時の自動変換をされてしまうと困ります。しかし、行末が CRLF なファイルが紛れ込んでしまった場合には Git に自動修正してもらいたいものです。コミット時の CRLF から LF への変換はさせたのでいけれどもそれ以外の自動変換が不要な場合は、core.autocrlf を input に設定します。

$ git config --global core.autocrlf input

この設定は、Windows にチェックアウトしたときの CRLF への変換は行いますが、Mac や Linux へのチェックアウト時は LF のままにします。またリポジトリにコミットする際には LF への変換を行います。

$ git config --global core.autocrlf false

Windows のみのプロジェクトで作業をしているのなら、この機能を無効にしてキャリッジリターンをそのままリポジトリに記録してもよいでしょう。その場合は、値 false を設定します。

Git - Git の設定

つまり、どういうことなの

core.autocrlf trueに設定すると、コミット時にcrlfがlfに書き換わる。そう、crlfがlfに書き換わる。大事なことなので二回言った。

差分に注意しててもやっぱり問題は発生するので、pushする前、プルリクエストを出す前などに、差分をとかく注意して見ること。