Skip to content

.gitignore

Git は基本的に作業ディレクトリに含まれている全てのファイルを管理します。つまり、作業ディレクトリのどの場所でも、新たにファイルを置いてコミットすればそのファイルは Gitea などのホスティングサービスから閲覧可能なものになります。

ところで、一般に多くのプログラムは安全性のために極力自身のディレクトリに収まる範囲で行動するよう設計されています。デバイスの色々な場所を許可なく書き換えられては困るので、ディレクトリ単位でひとまず行動領域を制限しているというわけです。とすれば、プログラムの実行に必要なデータも全て作業ディレクトリの内側に置いておきたいところです。

ところが、それをするとリポジトリの容量が不必要に大きくなったり、秘密にしておきたい情報をも公開リポジトリに含めなければいけなくなったりすることがあります。.gitignore はそのような問題を解決するためのファイルです。

.gitignore とは

.gitignore は「作業ディレクトリに載ってはいるが Git リポジトリに含めたくない」ファイルやディレクトリのパスや拡張子を記しておけるファイルです。多くの場合 .gitignore ファイルはリポジトリのルートに一つだけ置かれ、Git はそれを認識して、その中にパスが記されたファイルやディレクトリをバーション管理しないようにします。ただし、一度コミットされたファイルをあとで .gitignore に追加してもバージョン管理が続くことに注意が必要です。

.gitignore は主に以下のような用途で用いられます。

環境変数の除外

開発したシステムをずっと動かしておきたい場合、自分の PC で動かしておくわけにもいかないので、NeoShowcase などの外部の環境に デプロイ(移設)することになります。システムに対し環境ごとに異なる値を与えたい場合、それらは 環境変数 として与えます。NeoShowcase にも登録したアプリケーションそれぞれに環境変数を設定できる UI が存在します。

開発中のシステムが参照する環境変数は作業ディレクトリの内部に .env のようなファイルを用意して書いておくと便利です。その上で、本番環境に予め設定してある環境変数と競合を生じないよう、.gitignore に .env を加えてリポジトリからは除外しておく運用が一般的です。

環境変数と機密情報の秘匿

traP Gitea 上のリポジトリは部員に対してのみ公開されますが、GitHub などのホスティングサービスを使う場合は Web 上に公開された Git リポジトリで開発を進めていくことも珍しくありません。それどころか、GitHub の無料会員は数年前までプライベートリポジトリを作ることが出来ませんでした。

実行中のシステムが必要とする情報のうち、API トークン(パスワード)など外部に悪用されないように秘匿しておきたい文字列もよく環境変数として扱われます。実際に環境に依存するか否かはさておき、.gitignore の恩恵でリポジトリに含まれなくなった .env はこうした機密情報を置いておくにはうってつけの場所です。

ライブラリやモジュールの除外

多くのフレームワークでは Web 上からパッケージをインポートしてシステムに組み込むことが一般的です。そのため、パッケージのインポートと管理を担うパッケージマネージャと呼ばれるソフトウェアがフレームワークごとに提供されています。ちなみに、パッケージマネージャは Git 同様に代表的な CLI ソフトウェアの一種です。

必要なパッケージを箇条書きで記したファイル(依存関係リストファイル)だけあれば、それぞれの環境でパッケージマネージャがそれを自動で読み取ってパッケージをインポートしてくれるので、パッケージの実体は Git リポジトリに載せておく必要がありません。これらを収めるディレクトリがリポジトリ内に作られる場合、パスを .gitignore に載せておくことで Git リポジトリを軽量化することができます。

外部モジュールのとても雑な例え話

リュック 1 つと青春 18 きっぷで東海道線沿線 1 人旅をしたくなったとします。貴重品など替えが効かないものは持参する必要がありますが、当然リュックは軽い方が嬉しいので、コップやタオルなど現地調達可能なものはなるべく現地調達することにして、必要なものと一緒に調達したいもののメモだけをリュックに入れておくことにします。

  • リュック -> リポジトリ
  • 貴重品 -> オリジナルのソースコード
  • 現地調達可能なもの -> 外部パッケージ
  • 現地 -> システムが動く環境
  • 現地調達するもののメモ -> 依存関係リストファイル

対応させるならこんな感じでしょうか。外部パッケージは システムが動く環境で / パッケージマネージャが / 依存関係リストファイルをもとに調達してくれる ものなので リポジトリに含める必要がない という要点をご理解いただけると、筆者の体験談を出汁にした甲斐があります。厳密には友達と 3 人でした

その他の不要なファイルの除外

Git リポジトリを開発に用いる場合、基本的に「必要最低限のファイルを載せる」のがよい使い方であるとされています。モジュールだけでなく、ビルドの中間ファイルや生成物など、リポジトリから復元可能なデータや一時的にしか使わないデータの形式や保存場所は .gitignore に追加してリポジトリに含めない工夫がなされることが一般的です。

.gitignore の実例とテンプレート

traQ フロントエンドリポジトリのルートに置かれている .gitignore ファイル を例として見てみます。

実は、写っている最初の 6 行にこれまでに挙げた 3 つの .gitignore の用途が全て含まれています。Vite フレームワークによる Web 開発の実例として専門用語を交えて軽く紹介しますが、あまり深入りせず「そういうもの」程度に読んでいただければ大丈夫です。

  • 6 行目の .env.local環境変数を書いておくファイル です。先ほど「.env は一般に Git リポジトリに含めない」と書きましたが、紛らわしくも運用によっては .env が『環境に依存しない定数』を書く場所として用いられリポジトリに含まれることがあるので、本来の .env の役割である『環境依存』というニュアンスを強めてこのようなファイル名が用いられたりします。

  • 2 行目の node_modulesモジュールがインポートされるディレクトリ です。リポジトリのルートに見つかる package.json というファイルに必要なモジュールが全て列挙されているので、npm というパッケージマネージャがあれば自動でこのディレクトリの中身を再現できます。

  • 3 行目の /distビルド成果物を保存するディレクトリ です。リポジトリ の章で「フロントエンドは HTML + CSS + JavaScript で出来ている」ことに軽く触れましたが、ビルドされた HTML + CSS + JavaScript のシステムが収められる場所がこの dist です。

リポジトリの作成時に Gitea 側で .gitignore のテンプレートを含めるよう設定することもできます。作りたいシステムで使用するフレームワークごとに豊富なテンプレートが用意されています。