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.
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
| Pattern | What it ignores and why |
|---|---|
__pycache__/*.py[codz]*$py.class*.so | Bytecode 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/MANIFEST | Packaging 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.toml | SecretsEnvironment 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
- The
lib/andlib64/rules ignorelibdirectories at any depth. If your frontend code lives insrc/lib/, change the rule to/lib/or add!src/lib/. - The template mentions
poetry.lock,uv.lock,pdm.lockandPipfile.lockonly in comments and does not ignore them. For applications it is common to commit them for reproducible installs. - Remember that
.venvhas no trailing/, so a file with the same name (for example, a tool config file that records the virtual environment path) is ignored too. - gitignore cannot block the execution results (output cells) of Jupyter notebooks. To strip outputs before committing, use a tool such as nbstripout.
Original template
# 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