📝

.gitattributes に関するメモ

2020/12/07に公開

きっかけ

  1. composer で Laravel のプロジェクトを自動生成した時に、.gitattributes ファイルができていた
  2. npx create-nuxt-app で Nuxt.js のプロジェクトを自動生成した時には、.gitattributes ファイルが無い事に気付いた
  3. .gitattributes ファイルが無いと、どういう困った事が起こるんだろう

と思って、軽く調べたのでメモを残しておきます。

Laravel プロジェクトで自動生成された .gitattributes です。これを元に説明をしていきます。

* text=auto
*.css linguist-vendored
*.scss linguist-vendored
*.js linguist-vendored
CHANGELOG.md export-ignore

TL;DR

  • 特定ファイルやディレクトリ、拡張子毎に、git 操作をカスタマイズするためのファイル
    • バイナリファイルの diff を表示する
    • 改行文字の扱いを設定する
    • Linguist の扱いを設定する

少しだけ詳しく

.gitattributes を使うことで、ファイルやディレクトリに対して git の操作を色々と設定する事ができます。
例えば、 特別に設定をしていないとバイナリファイルの diff は下記のように表示されます。

$ git diff
diff --git a/image.png b/image.png
index ba5557e..f2da45c 100644
Binary files a/image.png and b/image.png differ

バイナリファイルの diff を表示する挙動を変える事で、次のような表示に変えて分かりやすくできます。この方法は こちら にあります。

diff --git a/image.png b/image.png
index ba5557e..f2da45c 100644
--- a/image.png
+++ b/image.png
@@ -1,11 +1,11 @@
 ExifTool Version Number         : 12.00
-File Name                       : JygOeq_image.png
-Directory                       : /var/folders/bg/kgh56f89493csw1t4_0h7sfm0000gn/T
+File Name                       : image.png
+Directory                       : .
 File Size                       : 760 kB
-File Modification Date/Time     : 2020:12:07 02:09:13+09:00
+File Modification Date/Time     : 2020:12:07 02:06:03+09:00
 File Access Date/Time           : 2020:12:07 02:09:13+09:00
-File Inode Change Date/Time     : 2020:12:07 02:09:13+09:00
-File Permissions                : rw-------
+File Inode Change Date/Time     : 2020:12:07 02:06:03+09:00
+File Permissions                : rw-r--r--
 File Type                       : PNG
 File Type Extension             : png
 MIME Type                       : image/png
@@ -16,5 +16,6 @@ Color Type                      : RGB with Alpha
 Compression                     : Deflate/Inflate
 Filter                          : Adaptive
 Interlace                       : Noninterlaced
+Warning                         : Corrupted PNG image
 Image Size                      : 1201x667
 Megapixels                      : 0.801

ここからは、最初にある .gitattributes について説明していきます。

  • text=auto

Git がテキストファイルと判定したら、改行コードを変換する設定になります。Windows と Mac, Linux など色々な環境で作業する場合、改行コードの違いで余計な差分が発生します。
そうなると PR のレビューがしにくかったり、コミットが汚くなってしまうので改行コードを自動で Git が変換してくれます。

  • linguist-vendored

linguist は、リポジトリでどの言語で書かれているか調べるライブラリの事です。
Laravel プロジェクトの場合は、ほとんどが PHP ファイルになりますがフロントエンドに JavaScript や CSS, Vue などが使われます。
複数の拡張子が存在する事で、linguist が間違った言語認識をする可能性があります。これを防ぐために、言語統計に含めたくないファイルを linguist-vendored で設定できます。

  • export-ignore

git archive する時に、アーカイブ対象に含めないようにする設定です。例にある CHANGELOG.md.gitignore などがそれに当たると思います。

参考

Discussion