Help us understand the problem. What is going on with this article?

Git for Windowsの改行コードの設定

Git for Windowsには改行コードを自動変換する機能があります。

しかし、この機能の設定を適切に行わないと、Windows上で作成したコードがLinux上で動作しないなどの不具合が生じます。

この記事では、改行コードを適切に設定する方法について解説します。

Gitの改行コードの自動変換機能

LinuxとWindowsの改行コードは次のようになっています。

  • Linux:LF
  • Windows:CRLF

Gitの改行コードの自動変換の設定項目は「core.autocrlf」です。この設定には以下の3つの値が設定できます。

設定 チェックアウトまたはクローン時 コミット時
true LF → CRLF CRLF → LF
input 変換なし CRLF → LF
false 変換なし 変換なし

どの値を設定するかは、どのOS上でコードを実行するかによって異なります。

  • Linux上で利用する場合 input
    チェックアウトやクローン時には変換せず、コミット時に「CRLF」を「LF」に変換します。Windows上で作成したファイルは「CRLF」となりますが、コミット時に「LF」へ変換されるため、Linux上で正常に動作させることができます。
    また、チェックアウト時は「LF」のままにしておきたいので、変換をしない「input」が適切です。

  • Windows上で利用する場合 false
    Windows上で作成したファイルは「CRLF」となり、チェックアウト時もコミット時も変換する必要はないので「false」を設定します。

Gitの設定ファイル

Gitには以下の3つの設定ファイルがあります。

  • システムの設定ファイル C:/Program Files/Git/etc/gitconfig
  • ユーザーの設定ファイル C:/Users/ユーザー名/.gitconfig
  • ローカルの設定ファイル .git/config *リポジトリ内のみ有効

読み込む順番は「システム → グローバル → ローカル」であり、後から読み込まれた設定によって上書きされます。つまり、ローカルの設定が最優先されます。

core.autocrlf の設定

core.autocrlf の設定は、作成するコードをどのOS上で利用するかによって異なります。

作成するコードがLinuxおよびWindowsの場合

私の場合、TerraformはWindows上で利用するので「CRLF」が必要ですが、AnsibleはLinux上で動作させるので「LF」が必要です。多くの人はLinuxおよびWindows両方のコードを必要とするこのケースに該当するかと思います。以下、LinuxまたはWindowsのどちらをデフォルトにするかによって設定が分かれます。

  • Linuxの改行コードをデフォルトとする場合 

ユーザーの設定ファイル input ローカルの設定ファイル false

デフォルトの設定として「input」(Linux用)を使用し、Windows用のコードを作成する時は「false」を適用する

  • Windowsの改行コードをデフォルトとする場合

ユーザーの設定ファイル false ローカルの設定ファイル input

デフォルトの設定として「false」(Windows用)を使用し、Linux用のコードを作成する時は「input」を適用する

こうすることで、LinuxとWindowsの両方に対応した適切な改行コードを設定することができます。

Linuxの改行コードをデフォルトとする場合

ユーザーの設定ファイル(--globalオプション)に input を設定します。

git config --global core.autocrlf input

設定を確認するには以下のコマンドを実行します。

git config --list --global

システムの設定ファイルに「core.autocrlf」が設定されていても、ユーザーの設定ファイルの方が優先度が高いため、ユーザーの設定ファイルが適用されます。念のため、システム設定ファイル(C:/Program Files/Git/etc/gitconfig)を開いて、「core.autocrlf」の値を「input」にするまたは削除しても良いと思います(システムの設定ファイルの値は、Gitインストール時の設定によって異なります)。

ローカルの設定を行わない限り、ユーザーの設定ファイルが適用されます。従って、ユーザーの設定ファイルに「input」を設定しておけば、そのユーザーが作成するすべてのコードはコミット時のみ「LF」に変換されます。

Windows用のコードを作成する時は、ローカルの設定ファイル(--localオプション)に false を設定します。

Windows用のプロジェクトのディレクトリ内で以下のコマンドを実行します。

git config --local core.autocrlf false

設定の確認を行うには以下のコードを実行します。

git config --list --local

ローカルに設定した場合はユーザーの設定よりも優先されるため、「input」を上書きして「false」となり、改行コードは変換されず「CRLF」のままとなります。

*Windowsの改行コードをデフォルトとする場合は、ユーザーとローカルの設定を逆にすれば可能です。

作成するコードがLinux用のみの場合

ユーザーの設定ファイル(--globalオプション)に input を設定します。

git config --global core.autocrlf input

作成するすべてのコードのコミット時に改行コードが「LF」に変換されます。

作成するコードがWindows用のみの場合

ユーザーの設定ファイル(--globalオプション)に false を設定します。

git config --global core.autocrlf input

すべてのコードに対して変換を行いません。つまり、作成時の改行コード(CRLF)のままとなります。

Gitで管理しないコードの改行コード VS Codeの設定

Gitでコードを管理する場合は、コミット時に自動変換を行うことでLinux上で動作させることができます。

しかし、Gitで管理しないコードはどうでしょうか?

例えば、Windows上でプロビジョニング用のコードを作成し、Linux上にアップロードして使用する場合、そのままでは正常に動作させることはできません。

そのような場合、テキストエディタの機能を使うことで解決できます。

各エディタには似たような機能があると思いますが、以下ではVS Codeについて説明します。

VS Codeには「Files eol」という既定の改行コードを設定する項目があり、以下の3つの値が設定できます。

  • auto(OSの改行コードを使用)
  • \n(LF)
  • \r\n(CRLF)

また、既定の改行コードの他にも、フォルダごとに改行コードを設定することができます。

そのため、通常はLinux用の改行コードを適用し、Windows用のフォルダにのみ「CRLF」を適用することが可能です。

以下では、既定の改行コードを「LF」、フォルダごとの改行コードを「CRLF」と設定する方法を説明します。

  • 既定の改行コードの設定

「設定」を開き、検索窓に「eol」と入力します。

「Files eol」の値を「\n(LF)」に変更します。

  • フォルダごとの改行コードの設定

該当フォルダのルートに「.vscode」フォルダを作成します。その中に「settings.json」ファイルを作成します。

settings.jsonに「CRLF」を設定する以下のコードを記述します。

{
  "files.eol": "\r\n"
}

このフォルダ内の改行コードはすべて「CRLF」となります。

解説は以上です。改行問題に悩まされることが少なくなれば幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away