【冷や汗】「あ、それ上げちゃダメ!」GitHubに絶対pushしてはいけないファイル10選&対策
「git push したあとに、なぜかAWSから高額請求の警告メールが来た…」
「先輩にプルリクを見てもらったら、顔面蒼白で『これすぐ消して』と言われた…」
エンジニアなら誰しも一度は聞く(あるいは経験する)ホラー話です。
GitHubは便利ですが、世界中に公開してはいけないものまでうっかり公開してしまうリスクと隣り合わせです。
今回は、初心者エンジニアがうっかりコミットしがちだけど、 「絶対に上げてはいけないファイル」 を10個厳選しました。
これを .gitignore に書くだけで、あなたのキャリアとクレジットカードが守られます。
💀 絶対に上げてはいけない「死のファイル」部門(セキュリティ編)
まずは、「うっかり」では済まない、人生に関わるレベルのファイルたちです。
1. .env ファイル
危険度:★★★★★★★★★★
環境変数を管理するファイル。ここにはAPIキー、DBのパスワード、秘密鍵などが直書きされていることが多いです。これを上げると、世界中のBotが数秒であなたのAPIキーを盗み、高額なインスタンスを立ち上げ始めます。
一番最初に .gitignore に書きましょう。
💡 実務のTips:
.env.exampleを作ろう
.envを除外すると、他のメンバーが「何の環境変数を設定すればいいの?」と迷ってしまいます。
キー名だけを書いて値は空にした.env.exampleというファイルを作ってコミットしておくと、チーム開発で感謝されます。(例:API_KEY=とだけ書いておく)
2. AWS / GCP / Azure などの認証ファイル
危険度:★★★★★★★★★★
credentials.csvgoogle-service-account.json-
aws_access_key_id
コード内にハードコードするのは論外ですが、ダウンロードした認証キーファイルをプロジェクトフォルダに置いたままgit add .してしまう事故が後を絶ちません。
3. SSH鍵(秘密鍵)
危険度:★★★★★★★★★★
id_rsa-
*.pem
サーバーへのアクセス権そのものです。これを公開するのは、家の合鍵を駅前で配るようなもの。絶対にリポジトリに含めてはいけません。
4. データベースのダンプ・実体ファイル
危険度:★★★★★★★★☆
db.sqlite3-
dump.sql
「テストデータだからいいや」と思っていても、本番データが混ざっていたり、個人情報が含まれていたりすることがあります。そもそもバイナリファイルや巨大なテキストはGit管理に向きません。
🌪 リポジトリを汚染する「ゴミ屋敷」部門(ノイズ編)
次は、セキュリティ的には死なないけれど、チームメンバーに「うわっ…」と思われるファイルたちです。
5. node_modules
迷惑度:★★★★★★
Node.jsの依存ライブラリの塊です。これを上げると、リポジトリのサイズが爆発的に増えますし、ファイル数が多すぎて差分が見えなくなります。
package.json と package-lock.json があれば、npm install で復元できるので、Gitに上げる必要はゼロです。
6. OSが勝手に作るファイル
迷惑度:★★★★☆
-
.DS_Store(Mac) -
Thumbs.db(Windows)
フォルダを開いただけでOSが勝手に作るサムネイルや表示設定ファイル。これが入っていると「あ、Mac使ってるんだな」とバレる以前に、コミットログが汚れます。
💡 実務のTips:PC全体で無視設定をする
プロジェクトごとに毎回除外設定を書くのは面倒です。
- ホームディレクトリに
~/.gitignore_globalを作成し、そこに.DS_Storeなどを記述。git config --global core.excludesfile ~/.gitignore_globalを実行。
これで、あなたのPCの全プロジェクトで自動的に無視されるようになります。
7. エディタ・IDEの設定ファイル
迷惑度:★★★☆☆
-
.vscode/(一部の設定を除く) -
.idea/
「俺の最強のエディタ設定」をチームに押し付けてはいけません。プロジェクト共通の推奨設定(.vscode/settings.jsonの一部など)以外は、個人の好みに属するため除外するのがマナーです。
8. ビルド生成物・コンパイル済みファイル
迷惑度:★★★★★
dist/build/__pycache__/*.class-
*.o
ソースコードから自動生成できるものは、バージョン管理する必要がありません。これらを含めると、コードを1行変えただけで大量のバイナリ差分が発生し、Gitが重くなります。
9. ログファイル
迷惑度:★★★★☆
*.log-
npm-debug.log
エラーログや実行ログ。開発中に出たログはあなただけのものです。これを共有されても、他のメンバーは困惑するだけです。
10. 個人のメモ・TODOリスト
迷惑度:★★☆☆☆
memo.txt-
todo.md(自分用の殴り書き)
プロジェクトのドキュメントならOKですが、「〇〇さんにチャット返す」「牛乳買う」みたいなメモが紛れ込むと恥ずかしいです。また、うっかりここにパスワードをメモしている可能性もあるため、実はセキュリティリスクも潜んでいます。
🛡️ 転ばぬ先の杖 .gitignore
これらのファイルをGitの監視対象から外すためのファイルが .gitignore です。
プロジェクトのルートディレクトリに作成し、以下のように記述します。
# セキュリティ関連
.env
*.pem
*.key
id_rsa
# OS関連(global設定していない場合)
.DS_Store
Thumbs.db
# 依存関係・ビルド
node_modules/
dist/
build/
__pycache__/
*.pyc
# ログ・DB
*.log
*.sqlite3
💡 便利なツール
「いちいち書くのが面倒くさい!」という方は、gitignore.io を使いましょう。
OS(macOS, Windows)や言語(Node, Python, Java)などを入力するだけで、最適な .gitignore の中身を生成してくれます。
😱 「やべっ、もう上げちゃってた!」という時
もし、.env などの機密情報をすでにGitHubにpushしてしまった場合、慌ててファイルを削除して再度pushしてもダメです。
Gitの「履歴」に残っているため、過去のコミットを見ればパスワードが見えてしまいます。
1. 【最優先】パスワード・APIキーを無効化する
何よりも先に、流出した鍵を無効化・再発行してください。
履歴から消す作業をしている間にも、攻撃者はBotを使って秒速で鍵を利用してきます。
ℹ️ 豆知識:シークレットスキャン機能
GitHubや主要クラウド(AWSなど)には、公開されたコードの中にキーが含まれていないか自動監視する「シークレットスキャン」という機能があります。
「GitHubから警告メールが来た」「AWSからキーを無効化したと連絡が来た」という場合は、この機能があなたを守ってくれた証拠です。通知に従って落ち着いて対処しましょう。
2. 履歴から完全に抹消する
ただの削除コミットではなく、過去の履歴そのものを書き換える必要があります。
昔は git filter-branch が使われていましたが、処理が遅く事故りやすいため、現在は公式に非推奨です。
現在は以下のツールを使うのが推奨されています。
-
git-filter-repo (推奨)
- Python製の高速なツール。現在のGit公式推奨です。
-
BFG Repo-Cleaner
- Java製。コマンドが簡単で扱いやすいため、こちらも人気があります。
どうしても怖い場合(初心者向け)
コマンドでの履歴操作に自信がない場合、もしチーム開発でなく自分だけのリポジトリであれば、 「リポジトリごと削除して作り直す」 のが一番確実で安全な場合もあります。
さいごに
「Gitは失敗を記録するツール」ですが、「公開してはいけない秘密」まで記録する必要はありません。
リポジトリを綺麗に保つことは、バグを防ぎ、チーム開発を円滑にする第一歩です。
「あ、これ .gitignore に入れてなかった!」と気づいたら、今すぐ追加しておきましょう!
それでは、安全で快適なGitHubライフを!🚀
※ コメントで教えていただきましたが、Marpなどを使う場合は共有が必要なケースもあるようです。勉強になります!
Discussion
これは実は悩ましくてね、特に、.vscode/settings.jsonは共有しないとやばいこともあります。特に、Marpの場合、markdown.marp.themesを共有しないとやばいです。Marpのカスタムテーマ設定(markdown.marp.themes)は、Markdownのフロントマター(YAML)には書けず、VS Codeの settings.json(ワークスペース設定)に記述するしかないという仕様が、この問題を一段と厄介にしています。
コメントありがとうございます!
Marpを使う場合は settings.json の共有が必要になるんですね…!
基本は除外としか考えていなかったので、その視点は完全に抜けていました。
カスタムテーマの仕様など、具体的な理由まで教えていただき勉強になります。
まだまだ知らないことが多いので、こうして補足いただけると本当に助かります!
そのため、私は、運用としてこのようにしています。
.gitignoreとsettings.jsonはCookiecutterから作らせる。
settings.jsonに個人仕様の入る内容は極力入れない。
可能ならば、ユーザドメインやプロファイルで逃げる。
そんで、この辺の設定ファイルはGEMINI.mdも含めてCookiecutterに作らせてます。
詳細な運用フローの共有、ありがとうございます!
Cookiecutterで初期生成から標準化してしまうのが、一番確実で安全ですね。
settings.json に個人設定を混ぜないための設計、非常に勉強になります。
特に GEMINI.md もテンプレート化されている点にすごい!となりました。AI活用の設定まで組み込まれているのは先進的ですね。
ぜひ参考にさせていただきます!
.envはdotenvxを使っている場合は上げて問題ないです。その場合.env.keysをgitignoreする必要があります。
コメントありがとうございます!
dotenvx…!勉強不足で、そのツールはキャッチアップできていませんでした。
暗号化して管理できるなら、確かに .env 自体を管理下に置けますね。
.env.keys を除外するという運用、非常にモダンで勉強になります。
ぜひ試してみたいと思います。貴重なキーワードをありがとうございます!
あとはsecretlintを導入することで、セキュリティ面で上げてはいけない内容を上げないように事前に防ぐこともできます。
紹介記事:
参考記事のリンクまで、ありがとうございます!!
具体的な導入手順が分かると、一気にハードルが下がって助かります。
Web ScratchもDevelopersIOも普段から参考にしているサイトなので、信頼感がありますね。
早速記事を拝見して、まずはローカル環境で試してみようと思います。
重ね重ね、有益な情報をありがとうございます!