🔧

面倒な.gitignoreづくりをmushiコマンドに任せよう

に公開

.gitignoreを生成するmushiコマンドを作ったので紹介したいと思います。
https://github.com/sirasagi62/mushi

モチベーション

言語やフレームワークごとに除外すべきファイルを選んで、.gitignoreを作成するのは非常に手間がかかります。

また、.env.keysのようなファイルをグローバル設定と.gitignoreの双方で除外し忘れるとセキュリティ上問題になる可能性があります。

というわけで、セキュリティと手間の両方の意味で.gitignoreづくりを自動化したいわけです。そこで、これを実現するためのコマンドmushiを作ってみました。

ちなみに同様のことを実現できるツールとして、gitignore.ioやgiboなどが存在しています。

mushiの特徴として、

  1. TUIでテンプレートを選択できる
  2. common.gitignoreを用いて言語・フレームワークにかかわらず共通で.gitignoreに入力したい項目を設定できる
  3. common.gitignoreでテンプレートをimportできる

という点が挙げられます。早速使い方を紹介したいと思います。

インストールと使い方

mushiはGoで書かれているので、Goコマンド経由で入手可能です。Goをバックエンドとして使えるmiseなんかでもインストールできます。

go install github.com/sirasagi62/mushi

新規で.gitignoreを作る場合にはmushi createを使います。
-iオプションを付けることでテキストで検索しながらTUIでテンプレートを確認できます。

mushi create -i

上記のコマンドを実行すると検索画面が立ち上がります。上下キーで移動ができる他、/<keyword>で<keyword>についてファジー検索できます。


-iでTUIを起動し/Goでファジー検索している

自分が使いたい言語・フレームワークをみつけたら、Enterキーを押すとその言語・フレームワークに対応した.gitignoreが生成されます。現時点ではおよそ300の言語・フレームワークに対応しています。

既存の.gitignoreにテンプレートを追記したい場合にはcreateの代わりにappendを使います。

mushi append -i

-iオプションを使わずにテンプレート名を入力すると直接.gitignoreが生成されます。appendでも使用可能です。

mushi create Go
mushi append Go

テンプレート名では大文字・小文字を区別しないためmushi create Goと入力してもmushi create goと入力してもGo言語の.gitignoreを生成できます。

またappend、createに-p/--pathオプションを指定してあげることで書き込み先をカスタマイズできます。

mushi create Go -p custom.gitignore
mushi append Go -p custom.gitignore

設定ファイル

mushi createで生成する場合、~/.config/mushi/common.gitignoreというファイルの中身がテンプレートの前に連結されます。

このファイルは言語・フレームワークに関係なく常に無視すべきファイルを指定するために使われます。デフォルトでは.DS_Storeや:Zone.IdentiferのようなOS固有のファイルや.env,.env.keys,SSH関連のようなセキュリティにかかわるファイルが設定されています。

これらの項目のうち、開発環境と密接に関わる部分については、本来は各開発者の責任でgitのグローバル設定側(~/config/git/ignore)で禁止すべきだというのは間違いないと思います。しかし、WindowsとmacOSの自動生成ファイルについては一律で.gitignoreで禁止したところで特にデメリットが発生せず、むしろ禁止したほうが偶発的な巻き込みを防げるメリットのほうが上回ると判断したため[1]、デフォルト項目に含まれています。mushiの実装をするまでgitのグローバル設定の存在に気づけてなかった。

https://docs.github.com/ja/get-started/git-basics/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer
https://git-scm.com/docs/gitignore/ja

また、dotenvxの.env.keysのような複数の言語・フレームワークで共通して.gitignoreで除外すべきファイルについてもデフォルト設定に追加されています。

mushiはcreateを実行するたびに~/.config/mushi/common.gitignoreの存在を調べ、存在しない場合にはデフォルトの内容を書き込むようになっています。v0.4.1時点でのデフォルトの設定は以下のようになっています。

https://github.com/sirasagi62/mushi/blob/v0.4.1/cmd/default.txt

#Import:Global/Windowsのような設定が入っていますが、これはcommon.gitignore限定で利用可能な記法で、cache内のテンプレートを展開できます。Global/*には各種環境の設定が用意されているため、全レポジトリに共通でコピーしたい設定を簡潔に記述できます。

指定可能なテンプレート名はlistサブコマンドで確認できます。

また、これとは別に~/.config/mushi/config.tomlという設定があります。しかし、現状だとno_updateのみが設定可能です。no_updateはappend/createのたびにテンプレート情報をアップデート確認するかどうかを示す設定項目です。デフォルトではfalse、すなわち常にアップデートを確認するようになっています。

仕組み

様々な言語やフレームワークに対応させるためmushiではGitHub公式の.gitignoresコレクションを使っています。

https://github.com/github/gitignore/

このレポジトリを~/.cache/mushi/github-gitignoreにキャッシュし、指定された言語・フレームワークに対応する.gitignoreをコピーしているわけです。

ただ、実際にそれぞれの.gitignoreを見ていただければわかりますが、ものによって指定されているファイルがかなり異なります。例えばZig.gitignoreでは最小限の指定にとどまります。そのため、単にそれぞれのテンプレートをコピーするだけだと、環境によってはOS固有のファイルやセキュリティ上除外が必要なファイルを確実に除外することができません。これでは最初に提起したセキュリティ上の問題をクリアできないわけです。

mushiではこの問題に対して、~/.config/mushi/common.gitignoreを自動生成し、生成される.gitignoreに常に連結するという力技で解決しています。このアプローチだと確実に必要な記述が含まれるようになる一方

  • 一部のテンプレートで項目を重複指定しまう
  • 用途によっては不要なファイルが指定される

などの問題も発生します。とはいっても、これらの問題は.gitignoreを生成後に編集することで対処可能なため、誤って環境変数や証明書をcommitに含めてしまうリスクと比較すれば許容可能なトレードオフであると考えています。

まとめ

というわけで、今回は.gitignoreを自動生成するmushiコマンドを紹介しました。.gitignoreを作成される際には、ぜひ活用してみてください。

(2025/12/08) gitのグローバル設定に関する内容を追記,一部の表現を調整,gibo/gitignore.ioについて追記

脚注
  1. 例えば.DS_StoreについてはNext.jsのテンプレートでも.gitignoreによって明示的に除外されています ↩︎

Discussion