Skip to main content

行終端を処理するようGitを設定する

diff における問題を回避するため、行終端を正しく処理できるよう Git を設定できます。

Platform navigation

行末について

キーボードで 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 とファイルが一致していることがわかります。スペースで区切られた後、設定 (texttext eol=crlfbinary) が指定されています。 以下、利用可能な設定を見てみましょう。

  • 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 でファイルをバックアップしてから、すべてのファイルを削除して復元し、行終端を正規化します。

  1. 変更を追加またはコミットする前に、構成が Git によって正しく適用されていることを確認します。 たとえば、Git では、リポジトリ内のファイルがテキスト ファイルまたはバイナリ ファイルのいずれであるかが自動的に判断されます。 リポジトリ内のバイナリ ファイルが破損しないようにするには、.gitattributes でファイルをバイナリとして明示的にマークすることをお勧めします。 詳しくは、Git ドキュメントの「gitattributes - パスごとの属性の定義」を参照してください。

  2. リポジトリ内のファイルに対するローカルの変更が失われないようにするには、次のコマンドを実行して、未処理の変更を追加し、コミットします。

    Shell
    git add . -u
    git commit -m "Saving files before refreshing line endings"
    
  3. 新しい構成を反映するように現在のブランチ上のすべてのファイルを更新するには、次のコマンドを実行します。

    Shell
    git rm -rf --cached .
    git reset --hard HEAD
    
  4. 書き換えられ、正規化されたファイルを表示するには、次のコマンドを実行します。

    Shell
    git status
    
  5. 必要に応じて、リポジトリで未処理の変更をコミットするには、次のコマンドを実行します。

    Shell
    git commit -m "Normalize all the line endings"
    

参考資料