.gitignoreに.DS_Storeなど個人環境依存のファイルを含めても良いのではないか

Gitには、リポジトリに含めたくないファイルを指定できる .gitignore というファイルがあります。 通常は、これ自体リポジトリにコミットされ、チームで共有されます。

この.gitignoreファイルに、 .DS_Store(Mac環境で自動的にOSが生成するファイル)や、.swp(vimが一時的に生成するスワップファイル)など個人環境に依存するファイルは指定すべきではない、という話をツイッターで見かけて気になりました。

筆者は、これまで、こういったファイルを積極的に指定するようにしていたからです。

.DS_Storeなどを入れるべきでない理由

.gitignoreに.DS_Storeやなどを指定すべきでない理由として上げられているのは、vimのユーザーが参加したら.swpを、 VS Codeユーザーが参加したら.vscode、Windowsユーザーが参加したらThumbs.dbといったように、開発者個々の事情で必要な項目を足していったら際限がない、というものです。

.DS_Storeを入れたい動機

筆者が.DS_Storeなどのファイルを.gitignoreに指定したいと思う理由は、チーム開発において、これらの設定をリポジトリレベルで共有できれば、個々のユーザー環境設定に依存せずに済むからです。これにより、.DS_Storeのようなゴミファイルがリポジトリに混入してしまうことを確実に防げます。

入れないとなると、こういったファイルがリポジトリに入れられるたびに、開発者にそれらをグローバルな設定として無視するように頼む、事前にそれらの設定をしておくようにドキュメントを準備する、などの手間が生じます。

開発者個々の事情で項目が増えていくという懸念に関しては、筆者はまったく心配しておらず、必要な人が自分に必要な設定をどんどん追加して、それをチーム全体で共有すればいいという考えです。Windowsユーザーが入ったらThumbs.dbを追加すればいいですし、VS Codeユーザーが入ったら.vscodeも追加すればいいのです。

gitignoreの公式ドキュメント

公式ドキュメント には、.gitignoreを含むgitの無視ファイルの設定について、以下のようにユースケースが挙げられています。

Patterns which should be version-controlled and distributed to other repositories via clone (i.e., files that all developers will want to ignore) should go into a .gitignore file.

Patterns which are specific to a particular repository but which do not need to be shared with other related repositories (e.g., auxiliary files that live inside the repository but are specific to one user’s workflow) should go into the $GIT_DIR/info/exclude file.

Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice) generally go into a file specified by core.excludesFile in the user’s ~/.gitconfig. Its default value is $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead.

バージョン管理されて、他のリポジトリにclone経由で配布されるべきパターン(例えば、すべての開発者が無視したいであろうファイル)は、.gitignoreに含めるべき。

特定のリポジトリに固有だが、他の関連付けられたリポジトリと共有する必要のないパターン(たとえば、リポジトリ内に存在する補助的なファイルだが、ユーザーのワークフローに固有のもの)は、 $GIT_DIR/info/excludeファイルに含めるべき。

ユーザーが、いつでもGitに無視させたいパターン(たとえば、 ユーザーが選んだエディタによって生成されたバックアップや一時ファイル)は、一般に、ユーザーの ~/.gitconfig内にあるcore.excludesFileで指定されたファイルに含める。デフォルト値は $XDG_CONFIG_HOME/git/ignore。もし $XDG_CONFIG_HOME がセットされていないか空の場合、 $HOME/.config/git/ignore が代わりに使われる。

(日本語訳は筆者による)

これを素直に解釈すると、.DS_Storeは、.gitignoreに指定せず、3番目のcore.excludesFileに入れるのが、マニュアルで推奨される使いかたのようです。ただ、3番目の説明については、 should(すべき)という表現を使っていない点は注目したいところです。ユーザーがいつでもGitに無視させたいパターンをcore.excludeFile以外で指定することを許容しているようにも読めます。

一般的なリポジトリではどうしているか

世間のプロジェクトではどのように運用しているのか気になったので、いくつかのプロジェクトをランダムにピックアップして調べました。

プロジェクト .DS_Storeなどを含めている
git No
Rails No
Linux No
vim No
express Yes
flow Yes
React Yes
docker/cli Yes
docker/compose Yes
sinatra Yes
rust Yes
chromium Yes
gechko Yes

Railsでは、

# Don't put *.swp, *.bak, etc here; those belong in a global .gitignore.
# Check out https://help.github.com/articles/ignoring-files for how to set that up.

のように明示的に禁止されています。

Linuxでは、cscope,ctags,gtagsといった補助ツールのものや、 *~ といった(おそらくviの)バックアップファイルも含まれています。これは、これらのツールがプロジェクトの標準的な開発ツールとして認められているからではないかと思います。

同様に、vimでは.swp(vim固有のファイル)が含まれていますが、これもvimの開発者はvimを使う(つまり個人環境に依存しない)と想定されるためでしょう。

しかし、上記の簡単な調査結果を見る限り、.DS_Storeを.gitignoreに含めるのが少数派とまでは言えないのではないでしょうか。

結論

公式ドキュメントの典型的なユースケースとは違っていることを承知の上で、 .DS_Storeや.swpなどの個人環境に依存する設定を.gitignoreに指定しても良いと思います。

それは、

からです。