Configuring Git to handle line endings
To avoid problems in your diffs, you can configure Git to properly handle line endings.
Every time you press return on your keyboard you're actually inserting an invisible character called a line ending. 伝統的に、オペレーティング システムごとに行終端の扱いが異なります。
ファイル内の変更を表示すると、Git は独自の方法で行終端を扱っています。 Git と GitHub Enterpriseでコラボレートしているため、自分が Windows マシンを使用し、コラボレーターが OS X で変更した場合、Git により予想外の結果が生じる可能性があります。
行終端のグローバル設定
Git による行終端の扱い方を変更するには git config core.autocrlf
コマンドを使用します。 必要な引数は 1 つです。
OS X では、設定に input
を渡すだけです。 例:
$ git config --global core.autocrlf input
# 行終端を正しく処理するように OS X で Git を設定する
Windows では、設定に true
を渡すだけです。 例:
$ git config --global core.autocrlf true
# 行終端を正しく処理するように Windows で Git を設定する
Linux では、設定に input
を渡すだけです。 例:
$ git config --global core.autocrlf input
# 行終端を正しく処理するように Linux で Git を設定する
OS X と Linux では、通常は設定に input
を渡します。 Windows では、 通常 true
を渡します。 例:
$ git config --global core.autocrlf input
# 行終端を正しく処理するように OS X または Linux で Git を設定する
$ git config --global core.autocrlf true
# 行終端を正しく処理するように Windows で Git を設定する
リポジトリ単位での設定
特別な .gitattributes ファイルを構成することで、Git が行終端を管理する方法をリポジト単位で設定できます。 このファイルをリポジトリにコミットすると、個々の core.autocrlf
設定より優先され、全ユーザそれぞれの Git 設定に関わらず一貫した動作を確保できます。 .gitattributes ファイルのメリットは、設定した行構成がリポジトリに関連付けられることです。 コラボレータが同じ行終端の設定をしているかどうか心配する必要はありません。
.gitattributes ファイルは、リポジトリのルートに作成し、他のファイルと同様にコミットする必要があります。
.gitattributes ファイルは 2 列で構成される表のようなものです:
- 左側は Git が一致させるファイル名です。
- 右側はそのようなファイルに対して Git が使用すべき行終端の設定です。
サンプル
以下は .gitattributes ファイルの例です。 あなたのリポジトリでのテンプレートとしてご使用ください:
# core.autocrlf を設定していない人のために、デフォルトの動作を設定する。
* text=auto
# 常に正規化し、チェックアウトの際ネイティブの行終端に変換したい
# テキストファイルを明示的に宣言する。
*.c text
*.h text
# チェックアウトの際常に CRLF を行終端とするファイルを宣言する。
*.sln text eol=crlf
# 完全にバイナリで変更すべきでないファイルをすべて示す。
*.png binary
*.jpg binary
上のように、まずファイルの種類を示し (*.c
、*.sln
、*.png
など)、そのあとに区切り文字として空白文字を続け、そのあとに、そのファイルの種類に適用すべき設定 (text
、text eol=crlf
、binary
など) を指定します。 以下、利用可能な設定を見てみましょう。
<
dl>
text=auto
text eol=crlf
CRLF
に変換します。 OSX や Linux であったとしても、終端が CRLF
でなければならないファイルにはこれを使用する必要があります。
text eol=lf
LF
に変換します。 Windows であったとしても、終端が LF でなければならないファイルにはこれを使用する必要があります。binary
binary
設定は -text -diff
のエイリアスでもあります。行終端を変更した後でリポジトリを更新
core.autocrlf
オプションを設定して .gitattributes ファイルをコミットすると、Git は変更されていないファイルをもコミットしようとします。 この段階で、Git はあらゆるファイルの行終端を変更しようとします。
リポジトリの行終端を自動的に設定する最良の方法は、まず Git でファイルをバックアップし、リポジトリからあらゆるファイルを削除して (.git ディレクトリ以外)、その後いっせいにファイルを復元することです。
-
作業結果を失うことのないよう、Git で現在のファイルを保存します。
$ git add . -u $ git commit -m "Saving files before refreshing line endings"
-
変更したファイルをすべて再度追加し、行終端を正規化します。
$ git add --renormalize
-
書き直し、正規化したファイルを表示します。
$ git status
-
変更をリポジトリにコミットします。
$ git commit -m "Normalize all the line endings"
参考リンク
- Pro Git ブックの「Git のカスタマイズ - Git の属性」
- "git-config(1) マニュアルページ"
- Pro Git ブックの「使い始める - 最初の Git の構成」
- "Mind the End of Your Line" - Git での行終端の全解説、Tim Clem 著