📄

[Git] リポジトリで改行コードを正規化する

2022/08/11に公開

方法

  1. ワーキングツリー上のルートディレクトリでテキストファイルを生成します。ファイル名は .gitattributes です。
  2. pattern を使用してファイルを指定します。改行コードは LF, CRLF から選択します。
.gitattributes
# チェックイン時、LFに正規化します。
# チェックアウトの際、常に改行コードをLFにします
*.json text eol=lf

# チェックインの際、LFに正規化します
# チェックアウトの際、常に改行コードをCRLFにします
*.bat text eol=crlf
  1. 作成した .gitattributes ファイルをコミットします
git add .gitattributes
git commit
  1. 過去にコミットしたファイルも正規化するため、過去ファイルも再度追加、コミットします
git add --renormalize .
git commit

説明

Gitではgit switchgit checkoutのような、リポジトリからワーキングツリーにコピーする時とgit addgit commitのように、ワーキングツリーからリポジトリに保存する時、テキストファイルの改行コード (EOL: end-of-line)を正規化する挙動があります。

.gitattributes ファイルで指定しない場合、通常はワーキングツリーの環境にあるGitの設定、git-config に依存します。git-config についての詳細はここでは省きますが、環境によってテキストファイルの改行コードがそろわなくなります。リポジトリのクローンを行った時点で、ある環境ではLF、ある環境ではCRLFになります。

.gitattributes ファイルはテキストファイルです。このファイルは通常、リポジトリのルートディレクトリに配置され、リポジトリ内のファイルについての設定が記入されます。テキストファイルの改行コードも、その設定の1つです。

ファイル指定には pattern を使用します。 pattern のフォーマットは否定(!)と末尾のスラッシュ以外は .gitignore ファイルと同じです。以下は公式ドキュメントの.gitignoreの情報から抜粋したものです。

  • # で始まる行はコメントになります
  • 先頭で # を使用したパスを使用する場合、バックスラッシュを置く必要があります (\#)
  • 末尾の空白はバックスラッシュ \ を前に置かない限り無視されます
  • スラッシュ / はディレクトリの境界として使用されます。
  • アスタリスク * はスラッシュ以外のすべてに一致します。
  • クエスチョンマーク ? はスラッシュ以外の任意の1文字に一致します
  • 範囲表記、たとえば[a-zA-Z]を使用して、範囲内の文字の中からある1文字に一致させることができます。
  • アスタリスク2つ ** は特別な場合があります
    • 先頭に **/ を書くと、すべてのディレクトリで一致することを意味します
    • 末尾に /** と書くと、内部のすべてに一致します
    • スラッシュで挟んだ場合 /**/ 、スラッシュ前後のパターンに一致し、間はさまざまになります

この設定は .gitattributes が作成されたときに、新規追加されたテキストファイルにのみ適用されます。すでに追加されているテキストファイルには効果がありません。

過去に追加したテキストファイルにも改行コードの正規化を行う場合、過去に追加したテキストファイルを再度コミットする必要があります (git add --renormalize .)

参考

GitHubで編集を提案

Discussion