第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

.envUntracked files から消え、代わりに新しく作った .gitignore 自身が新規ファイルとして表示されます。

git add .gitignore
git commit -m "add .gitignore to exclude secrets"

.gitignore のパターン記法

.gitignore に書けるのは単純なファイル名だけではありません。代表的なパターンを以下にまとめます。

パターン

意味

.env

ファイル名完全一致

*.log

拡張子 .log の全ファイル

_build/

ディレクトリ全体

**/temp/

任意の深さの temp/ ディレクトリ

!keep.log

*.log に含まれていても 除外しない (再含める)

# comment

コメント行

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 を付け忘れるとローカルファイルも消えるので注意。

ハンズオン課題

  1. .gitignore*.log を追加し、test.log を作って git status で除外されることを確認

  2. gitignore.io で「Python」と「Windows」を選択して標準的な .gitignore を生成し、自分のリポジトリに取り込む

  3. .gitignore!important.log を追加し、important.log だけは追跡対象になることを確認

まとめ

  • .gitignore は秘匿情報・生成物・OS ゴミを除外する

  • パターンは glob 風 (*.logdir/!file 等)

  • 既追跡ファイルには効かない (git rm --cached で外す)

  • .env のような秘密は 最初から コミットしない