github/gitignore · Python.gitignore

Python .gitignore Template Explained

Why Python.gitignore ignores __pycache__, virtual environments, packaging output, test and type-checker caches and secret settings, with notes on lib/ and lockfiles.

Open in generator Open with JupyterNotebooks, macOS, VisualStudioCode, JetBrains

Python.gitignore is a large template meant to cover everything from pure Python projects to Django and Flask web apps, data science and package publishing. It gathers bytecode caches, virtual environments, packaging folders created by setup.py or build backends, and caches from tools such as pytest, mypy and ruff in one place.

With so many rules, some paths get caught unintentionally. In particular, it ignores directories with common names such as lib/, build/, dist/ and target/ at any depth, so in repositories mixed with other languages it is worth testing the result once.

Rules explained

PatternWhat it ignores and why
__pycache__/*.py[codz]*$py.class*.soBytecode and extension modulesThe .pyc cache the interpreter writes on import and shared libraries built from C extensions. *.py[codz] is a bracket pattern that catches .pyc, .pyo, .pyd and .pyz at once. All of them are rebuilt from source.
build/dist/*.egg-info/*.eggwheels/sdist/MANIFESTPackaging outputDistribution files and metadata created by python -m build or setuptools. Built distributions are uploaded to an index such as PyPI, not stored in the source repository.
.venvvenv/env/ENV/__pypackages__/Virtual environmentsThey have the interpreter path baked in, so they stop working when moved to another computer, and they are large. Share dependencies through requirements.txt or pyproject.toml plus a lockfile.
.pytest_cache/.tox/.nox/.coveragehtmlcov/coverage.xml.hypothesis/Test and coverage cachesResults and caches left by test runners and coverage tools. They change on every run, so treat them only as CI artifacts.
.mypy_cache/.pyre/.pytype/.ruff_cache/Type checker and linter cachesLocal caches that speed up static analysis; if deleted, they are recreated on the next run.
local_settings.pydb.sqlite3instance/.webassets-cachecelerybeat-schedule*Framework local dataDjango local settings and development SQLite database, Flask's instance/ folder, and the Celery beat schedule file. Their contents differ per developer and they easily end up containing secrets.
.env.envrc.pypirc.streamlit/secrets.tomlSecretsEnvironment variable files, direnv settings, .pypirc with PyPI upload tokens, and Streamlit secrets. Once committed they stay in history, so exclude them from the start.
.ipynb_checkpointsprofile_default/ipython_config.py/sitedocs/_build/Notebooks and other toolsJupyter checkpoints, IPython profiles, and build output from mkdocs (/site) and Sphinx (docs/_build/). /site starts with /, so it refers only to site at the repository root.

Practical notes

Original template

Python.gitignore96 rules
# Byte-compiled / optimized / DLL files__pycache__/*.py[codz]*$py.class# C extensions*.so# Distribution / packaging.Pythonbuild/develop-eggs/dist/downloads/eggs/.eggs/lib/lib64/parts/sdist/var/wheels/share/python-wheels/*.egg-info/.installed.cfg*.eggMANIFEST# PyInstaller#   Usually these files are written by a python script from a template#   before PyInstaller builds the exe, so as to inject date/other infos into it.*.manifest*.spec# Installer logspip-log.txtpip-delete-this-directory.txt# Unit test / coverage reportshtmlcov/.tox/.nox/.coverage.coverage.*.cachenosetests.xmlcoverage.xml*.cover*.py.cover*.lcov.hypothesis/.pytest_cache/cover/# Translations*.mo*.pot# Django stuff:*.loglocal_settings.pydb.sqlite3db.sqlite3-journal# Flask stuff:instance/.webassets-cache# Scrapy stuff:.scrapy# Sphinx documentationdocs/_build/# PyBuilder.pybuilder/target/# Jupyter Notebook.ipynb_checkpoints# IPythonprofile_default/ipython_config.py# pyenv#   For a library or package, you might want to ignore these files since the code is#   intended to run in multiple environments; otherwise, check them in:# .python-version# pipenv#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.#   However, in case of collaboration, if having platform-specific dependencies or dependencies#   having no cross-platform support, pipenv may install dependencies that don't work, or not#   install all needed dependencies.# Pipfile.lock# UV#   Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.#   This is especially recommended for binary packages to ensure reproducibility, and is more#   commonly ignored for libraries.# uv.lock# poetry#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.#   This is especially recommended for binary packages to ensure reproducibility, and is more#   commonly ignored for libraries.#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control# poetry.lock# poetry.toml# pdm#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.#   pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.#   https://pdm-project.org/en/latest/usage/project/#working-with-version-control# pdm.lock# pdm.toml.pdm-python.pdm-build/# pixi#   Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.# pixi.lock#   Pixi creates a virtual environment in the .pixi directory, just like venv module creates one#   in the .venv directory. It is recommended not to include this directory in version control..pixi/*!.pixi/config.toml# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm__pypackages__/# Celery stuffcelerybeat-schedule*celerybeat.pid# Redis*.rdb*.aof*.pid# RabbitMQmnesia/rabbitmq/rabbitmq-data/# ActiveMQactivemq-data/# SageMath parsed files*.sage.py# Environments.env.envrc.venvenv/venv/ENV/env.bak/venv.bak/# Spyder project settings.spyderproject.spyproject# Rope project settings.ropeproject# mkdocs documentation/site# mypy.mypy_cache/.dmypy.jsondmypy.json# Pyre type checker.pyre/# pytype static type analyzer.pytype/# Cython debug symbolscython_debug/# PyCharm#   JetBrains specific template is maintained in a separate JetBrains.gitignore that can#   be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore#   and can be added to the global gitignore or merged into this file.  For a more nuclear#   option (not recommended) you can uncomment the following to ignore the entire idea folder.# .idea/# Abstra#   Abstra is an AI-powered process automation framework.#   Ignore directories containing user credentials, local state, and settings.#   Learn more at https://abstra.io/docs.abstra/# Visual Studio Code#   Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that#   can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore#   and can be added to the global gitignore or merged into this file. However, if you prefer, you#   could uncomment the following to ignore the entire vscode folder# .vscode/# Temporary file for partial code executiontempCodeRunnerFile.py# Ruff stuff:.ruff_cache/# PyPI configuration file.pypirc# Marimomarimo/_static/marimo/_lsp/__marimo__/# Streamlit.streamlit/secrets.toml

Templates from github/gitignore/Python.gitignore @356fd7b (2026-09-11) · CC0-1.0

Often used together

More template explanations