行終端を処理するようGitを設定する
diff における問題を回避するため、行終端を正しく処理できるよう Git を設定できます。
ここには以下の内容があります:
キーボードで return を押すたびに、実際には行終端と呼ばれる目に見えない文字が挿入されています。 伝統的に、オペレーティング システムごとに行終端の扱いが異なります。
ファイル内の変更を表示すると、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 を設定する
リポジトリ単位での設定
特別な .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
など) を指定します。 以下、利用可能な設定を見てみましょう。
- `text=auto`
- Git が最善と判断する方法でファイルを処理します。 これは便利なデフォルトのオプションです。
- `text eol=crlf`
- Git will always convert line endings to `CRLF` on checkout. You should use this for files that must keep `CRLF` endings, even on OSX or Linux.
- `text eol=lf`
- Git will always convert line endings to `LF` on checkout. Windows であったとしても、終端が LF でなければならないファイルにはこれを使用する必要があります。
- `binary`
- Git は指定されているファイルがテキストではなく、変更を試みるべきではないことを理解します。 The `binary` setting is also an alias for `-text -diff`.
-
作業結果を失うことのないよう、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 著
行終端を変更した後でリポジトリを更新
core.autocrlf
オプションを設定して .gitattributes ファイルをコミットすると、Git は変更されていないファイルをもコミットしようとします。 この段階で、Git はあらゆるファイルの行終端を変更しようとします。
The best way to automatically configure your repository's line endings is to first backup your files with Git, delete every file in your repository (except the .git directory), and then restore the files all at once.