.gitattributesのeol=crlfは改行コードをCRLFに変換してチェックインするものではない

https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

eol

This attribute sets a specific line-ending style to be used in the working directory. It enables end-of-line normalization without any content checks, effectively setting the text attribute.

Set to string value "crlf"

This setting forces git to normalize line endings for this file on checkin and convert them to CRLF when the file is checked out.

Set to string value "lf"

This setting forces git to normalize line endings to LF on checkin and prevents conversion to CRLF when the file is checked out.

eol=lfが「改行コードをLFに正規化してチェックインする」と明言しているのに対し、eol=crlfは「改行コードを正規化してチェックインする」としか言っていない。あくまでも「チェックアウト時にCRLFに変換する」機能なので、リポジトリにCRLFで格納することを強制する用途で使うことはできない。

以下はTortoiseGit 1.8.2.0(git version 1.7.11.msysgit.1)における動作確認記録。

「.gitattributes」が存在せず、「core.autocrlf=false」が設定されているリポジトリでは、テキストファイルは以下のように扱われる。

  • 改行コード LF のファイルを追加すると、リポジトリには改行コード LF のままコミットされる
  • 改行コード CRLF のファイルを追加すると、リポジトリには改行コード CRLF のままコミットされる
  • 改行コード LF のファイルをチェックアウトすると、作業ツリーには改行コード LF のままチェックアウトされる
  • 改行コード CRLF のファイルをチェックアウトすると、作業ツリーには改行コード CRLF のままチェックアウトされる

「.gitattributes」が存在せず、「core.autocrlf=true」が設定されているリポジトリでは、テキストファイルは以下のように扱われる。

  • 改行コード LF のファイルを追加すると、リポジトリには改行コード LF のままコミットされる
  • 改行コード CRLF のファイルを追加すると、リポジトリには改行コード LF でコミットされる
  • 改行コード LF のファイルをチェックアウトすると、作業ツリーには改行コード CRLF でチェックアウトされる
  • 改行コード CRLF のファイルをチェックアウトすると、作業ツリーには改行コード CRLF のままチェックアウトされる
  • 改行コード CRLF のファイルをチェックアウトして行を追加してコミットすると、リポジトリには追加した行も含めて改行コード CRLF のままコミットされる

「.gitattributes」で「eol=crlf」指定されているファイルは、「core.autocrlf」の設定によらず、以下のように扱われる。

  • 改行コード LF のファイルを追加すると、リポジトリには改行コード LF のままコミットされる
  • 改行コード CRLF のファイルを追加すると、リポジトリには改行コード LF でコミットされる
  • 改行コード LF のファイルをチェックアウトすると、作業ツリーには改行コード CRLF でチェックアウトされる
  • 改行コード CRLF のファイルをチェックアウトすると、作業ツリーには改行コード CRLF のままチェックアウトされる
  • 改行コード CRLF のファイルをチェックアウトして行を追加してコミットすると、リポジトリには全行改行コード LF でコミットされる

Windows上でチェックアウトする開発者が複数存在する場合、core.autocrlfをtrueにする人とfalseにする人が混在すると、リポジトリに格納されるファイルの改行コードも混在することになる。 できるだけ「.gitattributes」で「text=auto」「eol=crlf」を指定して正規化を強制するか、「-text」を指定して正規化させないことを強制しておいた方が、いろいろすっきりする。