おはようございます、YASUです。
今日はTerraformでもAWSでもなく、Gitの地味だけど超重要な脇役、.gitignoreについて書きます。存在は知っていたものの、正直「何となくおまじないで置いてあるファイル」くらいの認識だったのですが、ちゃんと理解すると「これ知らないと事故る」という代物でした。
結論
.gitignoreは、「このファイルはGitに管理してほしくありません」とGitに伝えるための、いわば門番リストです。これを設定していないと、パスワードが入った設定ファイルまで、うっかりGitHubに公開してしまうという、実務でも定番の事故につながります。
そもそも、なぜ「無視したいファイル」があるのか
プロジェクトのフォルダには、実は全部を記録・共有する必要のないファイルが結構混ざっています。
- 秘密情報が入ったファイル:APIキーやパスワードが書かれた
.envファイルなど - 自動生成されるファイル:プログラムを実行した時に自動で作られるキャッシュやログ
- 個人の作業環境の設定ファイル:自分のエディタ固有の設定(
.vscode/フォルダなど) - 巨大な依存ライブラリ:
node_modulesのような、コマンド一発で再インストールできる大量のファイル群
これらは「自分の手元にはあるけど、他の人と共有する必要がない、むしろ共有すると困る」ファイルです。何もしなければgit add .で全部まとめてステージングされてしまうので、これを防ぐための仕組みが.gitignoreです。
書き方はいたってシンプル
プロジェクトの一番上の階層に.gitignoreというファイルを作って、無視したいファイル名やパターンを1行ずつ書くだけです。
.env
node_modules/
*.log
.DS_Store
.terraform/
*.tfstate
これだけで、これらのファイルはgit statusにも表示されなくなり、間違ってgit addしてしまう心配がなくなります。
1行ずつ、何をしているか見てみる
.env:APIキーなどの秘密情報が入った定番ファイル。これが一番の要注意人物ですnode_modules/:JavaScript系のプロジェクトで大量に生成されるライブラリフォルダ。package.jsonさえあれば、コマンド一発で誰でも再現できるので、Git管理する意味がありません*.log:*はワイルドカードで「なんでも」を意味します。つまり拡張子が.logのファイルは全部無視、という指定です.DS_Store:Macが勝手に作る、フォルダの見た目設定を記録した謎ファイル。中身に意味はなく、共有する必要も皆無です.terraform/と*.tfstate:以前紹介したTerraformの話にも関係しますが、tfstateには機密情報が含まれることもあるため、これもうっかりコミットしないよう除外するのが定石です
「もう作っちゃったファイル」は、実は.gitignoreだけでは救えない
ここ、地味にハマりポイントです。.gitignoreはあくまで「これから追跡するかどうか」を制御するファイルなので、すでに一度コミットしてしまったファイルには効きません。
# 一度コミットされたファイルをGitの管理対象から外す(ファイル自体は手元に残る)
git rm --cached .env
このコマンドを打ってからコミットし直すことで、ようやく本当に無視されるようになります。「.gitignoreに書いたのに、まだ表示される…」と焦った時は、大体このパターンです。
実務でよくある「あるある事故」
Web上でもよく話題になりますが、.envファイルをうっかりpushしてしまい、そこに書かれていたAWSのアクセスキーが漏洩、不正利用されて高額請求が来た、という事例は残念ながら定番です。しかもGitは履歴を残す仕組みなので、後から慌てて削除しても、過去のコミット履歴にはまだ残っている、というのがさらに怖いところです(この場合は履歴自体を書き換える、より踏み込んだ対応が必要になります)。
.gitignoreを最初のコミットをする前にきちんと設定しておく、というのが一番の予防策です。
まとめ
.gitignoreは「Gitに管理してほしくないファイル」を指定する門番リスト- 秘密情報(.env)、自動生成物(node_modules)、OS固有ファイル(.DS_Store)などが定番の指定対象
- すでにコミット済みのファイルには効かないので、
git rm --cachedで管理対象から外す必要がある - プロジェクトを始めた最初のコミット前に設定しておくのが、一番の事故予防
地味な脇役かと思いきや、これを知らないと大事故に直結する、実はかなりの重要人物でした。それでは、また明日!

コメント