.gitignore の基本と実践
.gitignore の書き方を演習問題で学びます。不要なファイルをGitの追跡対象から外す方法を身につけましょう。
このチュートリアルでは、.gitignore ファイルの書き方と実践的な使い方を演習形式で学びます。node_modules/ や .env などのファイルを誤ってコミットしてしまうトラブルを防ぐために、.gitignore の理解は非常に重要です。
準備
演習用のリポジトリを作成します。
mkdir gitignore-practice
cd gitignore-practice
git init
echo "# Gitignore Practice" > README.md
git add README.md
git commit -m "初期コミット"
演習 1:.gitignore の基本構文を理解する
.gitignore ファイルには、Git に無視してほしいファイルやディレクトリのパターンを記述します。
問題: 以下のパターンがそれぞれ何を意味するか答えてください。また、これらのパターンを含む .gitignore ファイルを作成してください。
| パターン | 意味は? |
|---|---|
*.log | ? |
build/ | ? |
!important.log | ? |
doc/**/*.txt | ? |
答えを見る
| パターン | 意味 |
|---|---|
*.log | 拡張子が .log のすべてのファイルを無視 |
build/ | build ディレクトリ全体を無視 |
!important.log | *.log で無視されていても important.log だけは追跡する(除外の除外) |
doc/**/*.txt | doc/ 以下のすべての階層にある .txt ファイルを無視 |
.gitignore ファイルを作成してみましょう。
cat > .gitignore << 'EOF'
# ログファイルを無視
*.log
# ただし important.log は追跡する
!important.log
# ビルド成果物を無視
build/
# doc 以下のすべての .txt を無視
doc/**/*.txt
EOFコメント行は # で始めます。空行は無視されます。
演習 2:node_modules/ と *.log を gitignore に追加する
よくある JavaScript プロジェクトの構成を再現し、不要なファイルを無視する設定をしましょう。
問題: 以下のファイル・ディレクトリを作成したあと、node_modules/ ディレクトリと *.log ファイルを .gitignore に追加し、git status で無視されていることを確認してください。
# ダミーファイルを作成
mkdir -p node_modules/some-package
echo "exports = {}" > node_modules/some-package/index.js
echo "エラーログ" > error.log
echo "console.log('hello')" > app.js
答えを見る
.gitignore に追記します。
cat >> .gitignore << 'EOF'
# Node.js の依存パッケージ
node_modules/
# ログファイル
*.log
EOF状態を確認します。
git status出力例:
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
app.jsnode_modules/ と error.log が表示されなくなりました。.gitignore 自体は追跡対象として追加できます。
git add .gitignore app.js
git commit -m "gitignore を追加"演習 3:すでに追跡済みのファイルを gitignore で除外する
注意:
.gitignoreはすでに Git が追跡しているファイルには効きません。一度git addしてコミットしたファイルは、.gitignoreに追加しても引き続き追跡されます。
問題: 次の手順で「追跡済みファイルを後から除外する」問題を体験し、解決してください。
# 誤って .env ファイルをコミットしてしまった状況を再現
echo "SECRET_KEY=abc123" > .env
git add .env
git commit -m "誤って .env をコミット"
この状態で .gitignore に .env を追加しても、.env は引き続き追跡されます。どうすれば追跡を止められますか?
答えを見る
git rm --cached を使って、ファイルをインデックス(追跡リスト)から削除します。ファイル自体はディスク上に残ります。
# .gitignore に .env を追加
echo ".env" >> .gitignore
# インデックスから削除(ファイル本体は残る)
git rm --cached .env
# コミットして変更を記録
git add .gitignore
git commit -m ".env をトラッキングから除外"確認します。
git status
# .env は表示されない(無視されている)
ls
# .env ファイル自体はディスクに残っているディレクトリ全体をキャッシュから削除する場合は -r オプションを使います。
git rm -r --cached node_modules/重要: すでにコミットした
.envの内容は Git の履歴に残ります。機密情報が含まれる場合は、パスワードの変更やトークンの無効化が必要です。
演習 4:グローバル gitignore を設定する
OS 固有のファイル(macOS の .DS_Store、Windows の Thumbs.db など)は、すべてのリポジトリで無視したいファイルです。プロジェクトの .gitignore に書くと他の開発者に影響するため、個人設定のグローバル gitignore に書くのが適切です。
問題: グローバル gitignore ファイルを作成し、.DS_Store と Thumbs.db を全リポジトリで無視するように設定してください。
答えを見る
# グローバル gitignore ファイルを作成
cat > ~/.gitignore_global << 'EOF'
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
# エディタ
.vscode/
.idea/
*.swp
EOF
# Git にグローバル gitignore の場所を教える
git config --global core.excludesfile ~/.gitignore_global設定を確認します。
git config --global core.excludesfile
# ~/.gitignore_global と表示されるこれでどのリポジトリでも .DS_Store が自動的に無視されます。
演習 5:git check-ignore で確認する
.gitignore が正しく効いているか確認するには git check-ignore コマンドが便利です。
問題: debug.log と app.js に対して git check-ignore -v を実行し、それぞれどのように表示されるか確認してください。
# テスト用ファイルを作成
touch debug.log
答えを見る
git check-ignore -v debug.log出力例:
.gitignore:2:*.log debug.log出力の形式は <gitignore ファイル>:<行番号>:<パターン>\t<対象ファイル> です。どのファイルの何行目のパターンがマッチしているか一目でわかります。
git check-ignore -v app.jsapp.js は無視されていないため、何も表示されません(終了コードは 1)。
複数のファイルをまとめて確認することもできます。
git check-ignore -v debug.log error.log app.js .env補足:GitHub の gitignore テンプレート
言語・フレームワーク・エディタごとの .gitignore テンプレートが github/gitignore リポジトリで公開されています。新しいプロジェクトを始めるときは、このテンプレートを参考にすると便利です。
また、gitignore.io では、使用する言語やツールを入力すると最適な .gitignore を自動生成してくれます。
まとめ
このチュートリアルで学んだ .gitignore の操作:
# パターンの書き方
*.log ← 拡張子で指定
build/ ← ディレクトリを指定
!important ← 除外から除外(追跡する)
doc/**/*.txt ← 再帰的なパターン
# よく使うコマンド
git check-ignore -v <file> ← どのパターンが効いているか確認
git rm --cached <file> ← 追跡済みファイルをインデックスから削除
git config --global core.excludesfile ← グローバル gitignore の設定確認
.gitignore を適切に設定することで、不要なファイルの混入を防ぎ、チーム全体でクリーンなリポジトリを維持できます。