◀ 5.

djangoをgit管理する

▶
この記事の要点
  • Git リポジトリは manage.py と同じ階層(プロジェクトのルート)で git init する
  • .gitignore には __pycache__/・*.pyc・db.sqlite3・media/・仮想環境・.env を入れる
  • migrations フォルダはコミットする(チーム全員と本番で同じスキーマにするため)
  • settings.py の SECRET_KEY やパスワードは環境変数に出し、リポジトリに直書きしない
  • 依存パッケージは requirements.txt に書き出してコミットする

Django プロジェクトを Git 管理する手順(最短)

Git 自体の基本操作は Git 入門 を参照してください。ここでは Django プロジェクト特有の「どこで init するか」「何を除外するか」「何をコミットすべきか」を中心に説明します。

  1. manage.py があるディレクトリに移動する
  2. .gitignore を作成する(内容は後述)
  3. requirements.txt を作成する
  4. git init → git add → git commit
  5. 必要なら GitHub などのリモートを登録して push する
cd プロジェクト名
pip freeze > requirements.txt
git init
git add .
git status          # 除外したいファイルが含まれていないか確認
git commit -m "Initial commit"

.gitignore を先に作ってから git add するのがポイントです。順番が逆だと、db.sqlite3 などが一度追跡されてしまい、後から外す手間がかかります。

Git の導入場所

django-admin startproject で作成した外側のディレクトリ(manage.py がある階層)に .git と .gitignore を置きます。

プロジェクト名/
    .git
    .gitignore
    requirements.txt
    db.sqlite3
    manage.py
    プロジェクト名/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    アプリケーション名/
        __init__.py
        __pycache__/
        admin.py
        apps.py
        migrations/
        models.py
        views.py

内側の「プロジェクト名/」(settings.py がある階層)で init すると、manage.py や各アプリが管理対象から外れてしまうので注意してください。

.gitignore の記載内容

最低限、次の内容を入れておけば Django の開発で困ることはほぼありません。

# Python のキャッシュ
__pycache__/
*.py[cod]

# ログ・翻訳の中間ファイル
*.log
*.pot

# ローカル用の設定・秘密情報
local_settings.py
.env

# 開発用 DB
db.sqlite3

# ユーザーがアップロードしたファイル
media/

# collectstatic の出力先(STATIC_ROOT)
staticfiles/

# 仮想環境
venv/
.venv/

# エディタ・OS
.vscode/
.idea/
.DS_Store
除外するもの理由
__pycache__/・*.pycPython が自動生成するキャッシュ。環境ごとに作り直される
db.sqlite3開発用データが入る。バイナリで差分が取れず、他人のデータを上書きしてしまう
media/アップロードされたファイル。コードではなくデータ
staticfiles/collectstatic で生成される成果物。STATIC_ROOT の名前に合わせる
venv/OS や Python のバージョンに依存する。requirements.txt から再現する
.env・local_settings.pyパスワードや秘密鍵など、公開してはいけない値が入る

コミットすべきもの

  • migrations フォルダ: makemigrations で作られるファイルはコードの一部です。コミットしないと、他の開発者や本番環境で migrate したときにスキーマがずれます。中の __pycache__ だけが除外対象です
  • requirements.txt: 同じバージョンのパッケージを再現するために必要です
  • templates/・static/: 自分で書いたテンプレートや CSS・JS はコミットします(除外するのは collectstatic の出力先だけ)

落とし穴: SECRET_KEY をコミットしない

startproject で生成される settings.py には SECRET_KEY が直接書かれています。そのまま公開リポジトリに push すると、セッションの改ざんなどに悪用される恐れがあります。環境変数から読む形に書き換えておきましょう。

# settings.py
import os

SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"

DB のパスワードや API キーも同様です。.env ファイルから読み込むなら django-environ や python-dotenv などのライブラリが使えます。誤って push してしまった場合は、履歴から消すだけでなく SECRET_KEY 自体を新しい値に変更してください。

すでにコミットしてしまったファイルを外す

.gitignore は「まだ追跡していないファイル」にしか効きません。db.sqlite3 などを先にコミットしてしまった場合は、追跡だけを解除します(ファイル自体は消えません)。

git rm --cached db.sqlite3
git rm -r --cached __pycache__
git commit -m "Stop tracking generated files"

確認方法

  1. git status で、db.sqlite3・__pycache__・venv が「Untracked files」にも出てこないこと
  2. git check-ignore -v db.sqlite3 で、どの .gitignore の行で除外されているか確認できる
  3. 別のディレクトリに git clone し、pip install -r requirements.txt → python manage.py migrate → runserver で起動できれば、必要なファイルがそろっている

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成