OS や IDE 固有ファイルの .gitignore はどこにする?

Git のソースコード管理の除外指定する .gitignore。ときどき気になるのが Thumbs.db や .DS_Store などの指定がプロダクトの .gitignore ファイルに含まれているケース。開発者固有の設定、どこにしたらよいでしょう?

開発者固有のファイルはプロダクトのソースコード管理からは除外したいです。とはいえ OS が自動で作った Thumbs.db.DS_Store などは、いつの間にかソースコード管理に紛れ込んでしまうことも。それを避けるために .gitignore があるのですが、Thumbs.db などの除外指定がプロダクトの .gitignore ファイルに書かれているといつもモヤっとします。

プロダクトとして Thumbs.db.DS_Store が生成物であり、かつ管理不要だとしたらわかります。しかし、多くのケースはプロダクトの生成物ではありません。開発者固有といえるでしょう。このようなファイルの除外指定はどうするのが良いのか調べたのでまとめます。

gitignore.io での扱い

以前、本ブログで紹介した「.gitignore は、生成サービス gitignore.io を使って作ろう!」の gitignore.io は、さまざまな環境の .gitignore に対応しています。

たとえば Windows の定義 では [Dd]esktop.ini などが設定されています。もちろん macOS 版 もありますし、Linux 版 もあります。また Java のビルドツール Maven や、IDE の Visual Studio などといったツールに関するものもあります。

ただし、これらをどのように使うのかにつて言及したドキュメントはありませんでした。

GitHub の gitignore リポジトリ

gitignore.io 発祥の元となる GitHub の github/gitignore リポジトリを見てみます。このリポジトリは GitHub で新しいリポジトリを作成する際の [Add .gitignore] で使われるテンプレートです。

このリポジトリで気になるのが Global ディレクトリです。OS や IDE/エディター の設定が、この Global ディレクトリにあります。

そして、以下のドキュメントへのリンクがあります。色々説明がありますが OS 固有のファイルなどは global .gitignore を作り、そちらに設定するようにとのことです。

つまり、この Global ディレクトリにあるような定義はプロダクトの .gitignore ではなく、グローバル側(ユーザーのホームディレクトリ以下) に設定するとしています。

Git のドキュメント

GitHub で答えが出たように思いますが、最後に Git 公式では、どのように考えられているのか確認します。
.gitignore に関するドキュメント「Git - gitignore Documentation」があります。

まず .gitignore 自体について以下のように書かれています。
“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. - gitignore Documentation

そして、もうひとつ。
“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. - gitignore Documentation

ざっくり意訳すると「すべての開発者が無視したいファイルをバージョン管理して、クローン先の他リポジトリへ配布するパターンとして .gitignore ファイルを使うべき」で「ユーザーのエディターが生成したバックアップや一時ファイルは、~/.gitconfigcore.excludesFile で指定したファイルに入れる」といった感じでしょうか。

全開発者で共有する内容に .gitignore を使うべき(should be)で、ユーザー固有の設定は core.excludesFile で指定したファイルにするのが一般的(generally)であると。

ここでも OS 固有の設定は .gitignore ではなく、グローバル側(ユーザーのホームディレクトリ以下) に作るとしています。

まとめ

Git 公式ドキュメントや、GitHub の説明から考えると Thumbs.db.DS_Store などの OS 固有の設定は、 ~/.gitconfigcore.excludesFile 指定ファイルがよいといえるでしょう。

ただし使っている単語が should be / generally であり、must ではないので絶対ダメまではいかずとも、固有設定を .gitignore に入れるのだとしたら、よく考えてからやりましょう、といったところでしょうか。(RFC ではないし、全大文字でもないですが RFC 2119 - IPA に倣って)

core.excludesFile のデフォルトは、以下の順で見つけたファイルを使います。そのため core.excludesFile は明示的に設定せず、下記2番目の ~/.config/git/ignore ファイルを作って使うのが簡単です。

  • $XDG_CONFIG_HOME/git/ignore
  • $HOME/.config/git/ignore(= ~/.config/git/ignore)

これで、モヤっとしていたのがスッキリしました。
OS 固有の設定は ~/.config/git/ignore にしていきたいと思います。

では IDE/エディターの設定は?
“すべての開発者が無視したいファイル” か?、と考えると、やはり固有の設定といえるので ~/.config/git/ignore ですね。OSS ではなく、クローズドなプロジェクトの場合は .gitignore でよいかもしれませんが、いつ「すべての開発者」が変わるかもしれないと考えると ~/.config/git/ignore がよいと思います。