行末について
キーボードで return を押すたびに、行末と呼ばれる目に見えない文字が挿入されています。 行終端の処理は、オペレーティングシステムによって異なります。
Git と GitHub Enterprise Server でコラボレートしているときに、あなたが Windows マシンで作業をしていて、コラボレーターが macOS で変更を加えた場合、Git により予想外の結果が生じることがあります。
異なるオペレーティングシステムを使用しているユーザとも効果的にコラボレーションができるように、自動的に行終端を処理するよう Git を設定することができます。
行終端のグローバル設定
git config core.autocrlf
コマンドは、Git での行末の処理方法を変更するために使用されます。 必要な引数は 1 つです。
macOS では、構成に input
を渡すだけです。 次に例を示します。
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
Windows では、構成に true
を渡すだけです。 次に例を示します。
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
Linux では、構成に input
を渡すだけです。 次に例を示します。
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
リポジトリ単位での設定
オプションで .gitattributes
ファイルを設定すれば、特定のリポジトリで Git が行末をどう読み込むかを構成することもできます。 このファイルをリポジトリにコミットすると、すべてのリポジトリ共同作成者の core.autocrlf
設定がオーバーライドされます。 そのため、Git 設定と環境にかかわらずすべてのユーザで一貫した動作を確保できます。
.gitattributes
ファイルは、リポジトリのルートに作成し、他のファイルと同様にコミットする必要があります。
.gitattributes
ファイルは 2 列で構成される表のようなものです:
- 左側は Git が一致させるファイル名です。
- 右側はそのようなファイルに対して Git が使用すべき行終端の設定です。
例
.gitattributes
ファイルの例を次に示します。 リポジトリのテンプレートとして使用できます。
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.c
、*.sln
、*.png
とファイルが一致していることがわかります。スペースで区切られた後、設定 (text
、text eol=crlf
、binary
) が指定されています。 以下、利用可能な設定を見てみましょう。
-
text=auto
Git により、最適と判断された方法でファイルが処理されます。 これは便利なデフォルトのオプションです。 -
text eol=crlf
Git により、チェックアウト時に常に行末がCRLF
に変換されます。 OS X または Linux であったとしても、CRLF
の行末を維持しなければならないファイルにはこれを使用する必要があります。 -
text eol=lf
Git により、チェックアウト時に常に行末がLF
に変換されます。 Windows であったとしても、終端が LF でなければならないファイルにはこれを使用する必要があります。 -
binary
指定されているファイルがテキストではなく、変更を試みるべきではないことが Git で認識されます。 このbinary
設定は、-text -diff
の別名でもあります。
行終端を変更した後でリポジトリを更新
core.autocrlf
オプションを設定するか、.gitattributes
ファイルをコミットすると、Git によって、新しい設定に一致するように行終端が自動的に変更されます。 変更していないファイルに対する変更が Git によって報告される場合があります。
リポジトリのすべての行末を新しい構成と確実に一致させるには、Git でファイルをバックアップしてから、すべてのファイルを削除して復元し、行終端を正規化します。
-
変更を追加またはコミットする前に、構成が Git によって正しく適用されていることを確認します。 たとえば、Git では、リポジトリ内のファイルがテキスト ファイルまたはバイナリ ファイルのいずれであるかが自動的に判断されます。 リポジトリ内のバイナリ ファイルが破損しないようにするには、
.gitattributes
でファイルをバイナリとして明示的にマークすることをお勧めします。 詳しくは、Git ドキュメントの「gitattributes - パスごとの属性の定義」を参照してください。 -
リポジトリ内のファイルに対するローカルの変更が失われないようにするには、次のコマンドを実行して、未処理の変更を追加し、コミットします。
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
新しい構成を反映するように現在のブランチ上のすべてのファイルを更新するには、次のコマンドを実行します。
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
書き換えられ、正規化されたファイルを表示するには、次のコマンドを実行します。
Shell git status
git status
-
必要に応じて、リポジトリで未処理の変更をコミットするには、次のコマンドを実行します。
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
参考資料
- Pro Git ブックの「Git のカスタマイズ - Git の属性」
- Git の man ページ内の git-config
- Pro Git ブックの「概要 - はじめての Git セットアップ」
- 「Mind the End of Your Line」(行の終わりに注意する) Tim Clem