行末について
キーボードで 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 で現在のファイルを保存します。
$ 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 の man ページ内の git-config
- Pro Git ブックの「概要 - はじめての Git セットアップ」
- 「Mind the End of Your Line」(行の終わりに注意する) Tim Clem