第7章 .gitignore で守る¶
この章で学ぶこと¶
.gitignoreファイルの役割秘匿情報 (
.env) を除外する.gitignoreのパターン記法Windows 固有の除外パターン
動機・背景¶
Git で扱うべきファイルは、必ずしも作業ディレクトリにあるすべてのファイルではありません。API キーやパスワードなどの 秘匿情報、ビルドの 生成物、OS やエディタが勝手に作る ゴミファイルなどは、リポジトリに混ぜたくないものの代表例です。これらを誤ってコミットすると、容量が膨らむだけでなく、最悪の場合は機密情報が世界に漏れてしまいます。
.gitignore は、このような「追跡してほしくないファイル」のパターンを列挙しておくための専用ファイルです。.gitignore に書いたパターンに一致する未追跡ファイルは、git status の表示や git add の対象から自動的に除外されるようになります。
シナリオ: .env の登場¶
ある日、~/my-scripts のスクリプトから外部 API を呼び出すことになりました。API には認証用のキーが必要で、これをコードにそのまま埋め込むのは論外なので、慣例に従って .env ファイルにキーだけを書き、スクリプトから読み込む構成にすることにします。
まずは .env を作って git status を見てみましょう。
Set-Content -Encoding utf8 -Path .env -Value "API_KEY=sk_live_VERY_SECRET_DO_NOT_LEAK"
git status
期待出力:
Untracked files:
.env
危険
この状態でコミットして GitHub に push すると、API キーが世界中に公開されます。GitHub のスキャナーが検知して通知を送ってくれることもありますが、漏洩した瞬間に悪用される前提で対処しないといけません。漏らした場合は即座にキーを失効 (revoke) し、新しいキーに差し替える必要があります。
.gitignore を作る¶
.env がうっかりコミット対象に入らないようにするため、リポジトリのルートに .gitignore を作って .env を 1 行書き込みます。
Set-Content -Encoding utf8 -Path .gitignore -Value ".env"
git status
期待出力:
Untracked files:
.gitignore
.env が Untracked files から消え、代わりに新しく作った .gitignore 自身が新規ファイルとして表示されます。
git add .gitignore
git commit -m "add .gitignore to exclude secrets"
.gitignore のパターン記法¶
.gitignore に書けるのは単純なファイル名だけではありません。代表的なパターンを以下にまとめます。
パターン |
意味 |
|---|---|
|
ファイル名完全一致 |
|
拡張子 |
|
ディレクトリ全体 |
|
任意の深さの |
|
|
|
コメント行 |
Windows 固有の除外¶
Windows + Git for Windows の環境では、OS やエディタが勝手に生成するファイルもいくつかあります。Python プロジェクトでよくある生成物や、エディタの設定ディレクトリも併せて除外するのが定番です。.gitignore に追記する内容の例を示します。
# secrets
.env
.env.*
# Windows
Thumbs.db
*.lnk
ehthumbs.db
desktop.ini
# Editors
.vscode/
*.swp
# Python
__pycache__/
*.pyc
.venv/
# Logs
*.log
Tip
https://www.toptal.com/developers/gitignore で言語・OS・エディタを指定すると標準的な .gitignore を生成してくれます。GitHub も .gitignore テンプレート集を提供しています (https://github.com/github/gitignore)。
既にコミットしてしまったファイルを除外する¶
.gitignore は 未追跡 のファイルにしか効きません。すでに git add してコミットしてしまったファイルは、後から .gitignore に書き足しても追跡対象のままです。
すでに追跡されているファイルを追跡対象から外すには、git rm --cached を使います。
git rm --cached <file>
git commit -m "stop tracking <file>"
警告
git rm --cached は追跡を外すだけでローカルファイルは残ります。--cached を付け忘れるとローカルファイルも消えるので注意。
ハンズオン課題¶
.gitignoreに*.logを追加し、test.logを作ってgit statusで除外されることを確認gitignore.ioで「Python」と「Windows」を選択して標準的な.gitignoreを生成し、自分のリポジトリに取り込む.gitignoreに!important.logを追加し、important.logだけは追跡対象になることを確認
まとめ¶
.gitignoreは秘匿情報・生成物・OS ゴミを除外するパターンは
glob風 (*.log、dir/、!file等)既追跡ファイルには効かない (
git rm --cachedで外す).envのような秘密は 最初から コミットしない