Ownership is measured by how many commits each author made to each file in the current tree. It highlights bus-factor risk (files only one person has ever touched) and where knowledge is concentrated. The bus factor is the smallest number of people who are, between them, primary owner of more than half of the files.
Files only one author has ever changed. The more a file has changed, the more knowledge is at risk if that person leaves.
| File | Sole owner | Commits |
|---|---|---|
| src/pip/_internal/exceptions/__init__.py | Richard Si | 8 |
| tests/functional/test_install_release_control.py | Damian Shaw | 6 |
| news/8671.bugfix.rst | Sepehr Rasouli | 5 |
| tests/functional/test_install_format_control.py | Damian Shaw | 4 |
| tools/codespell-ignore.txt | Richard Si | 4 |
| docs/html/topics/workflow.md | Paul Moore | 4 |
| docs/html/topics/python-option.md | Paul Moore | 4 |
| src/pip/_vendor/rich/pager.py | Pradyun Gedam | 3 |
| src/pip/_vendor/rich/protocol.py | Pradyun Gedam | 3 |
| tests/data/src/pep518_invalid_requires/setup.py | Pradyun Gedam | 3 |
| File | Sole owner | Commits |
|---|---|---|
| src/pip/_internal/exceptions/__init__.py | Richard Si | 8 |
| tests/functional/test_install_release_control.py | Damian Shaw | 6 |
| news/8671.bugfix.rst | Sepehr Rasouli | 5 |
| tests/functional/test_install_format_control.py | Damian Shaw | 4 |
| tools/codespell-ignore.txt | Richard Si | 4 |
| docs/html/topics/workflow.md | Paul Moore | 4 |
| docs/html/topics/python-option.md | Paul Moore | 4 |
| src/pip/_vendor/rich/pager.py | Pradyun Gedam | 3 |
| src/pip/_vendor/rich/protocol.py | Pradyun Gedam | 3 |
| tests/data/src/pep518_invalid_requires/setup.py | Pradyun Gedam | 3 |
| tests/data/src/pep518_missing_requires/setup.py | Pradyun Gedam | 3 |
| tests/unit/test_command_debug.py | Damian Shaw | 2 |
| src/pip/_internal/build_env/__init__.py | Richard Si | 2 |
| src/pip/_internal/build_env/base.py | Richard Si | 2 |
| src/pip/_internal/build_env/noop.py | Richard Si | 2 |
| .github/workflows/update-build-project-lock.yml | Stéphane Bidoul | 2 |
| tests/data/indexes/require-invalid-version/require-invalid-version/index.html | Stéphane Bidoul | 2 |
| docs/html/cli/pip_inspect.rst | Stéphane Bidoul | 2 |
| src/pip/_vendor/rich/_cell_widths.py | Pradyun Gedam | 2 |
| src/pip/_vendor/rich/scope.py | Pradyun Gedam | 2 |
| src/pip/_vendor/rich/_spinners.py | Pradyun Gedam | 2 |
| .github/ISSUE_TEMPLATE/feature-request.yml | Pradyun Gedam | 2 |
| tests/data/src/pep518_invalid_build_system/pep518.py | Pradyun Gedam | 2 |
| tests/data/src/pep518_invalid_build_system/setup.py | Pradyun Gedam | 2 |
| tests/data/src/pep518_invalid_requires/pep518.py | Pradyun Gedam | 2 |
| tests/data/src/pep518_missing_requires/pep518.py | Pradyun Gedam | 2 |
| .github/FUNDING.yml | Pradyun Gedam | 2 |
| docs/man/commands/cache.rst | Ellen Marie Dash | 2 |
| docs/man/commands/debug.rst | Xavier Fernandez | 2 |
| tests/data/packages/brokenwheel-1.0-py2.py3-none-any.whl | Matthew Iversen | 2 |
| tests/data/packages/colander-0.9.9-py2.py3-none-any.whl | Marcus Smith | 2 |
| tests/data/packages/translationstring-1.1.tar.gz | Marcus Smith | 2 |
| news/ubuntu-oldest-python.trivial.rst | Damian Shaw | 1 |
| news/14372.feature.rst | Damian Shaw | 1 |
| news/14354.trivial.rst | Damian Shaw | 1 |
| news/14349.trivial.rst | Damian Shaw | 1 |
| tests/unit/test_autocompletion.py | Damian Shaw | 1 |
| news/14348.trivial.rst | Damian Shaw | 1 |
| news/14347.bugfix.rst | Damian Shaw | 1 |
| tests/unit/test_command_config.py | Damian Shaw | 1 |
| tests/unit/test_test_server.py | Damian Shaw | 1 |
| news/4842f4c6-2f77-4cc9-b5ee-5f764fd286bb.trivial.rst | Damian Shaw | 1 |
| news/60a24bb6-1a57-4eb6-b302-b62b7a05f40e.trivial.rst | Damian Shaw | 1 |
| news/14254.process.rst | Damian Shaw | 1 |
| news/14235.feature.rst | Damian Shaw | 1 |
| news/14237.bugfix.rst | Damian Shaw | 1 |
| tests/unit/test_command_show.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/contrib/emscripten/__init__.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/contrib/emscripten/connection.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/contrib/emscripten/emscripten_fetch_worker.js | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/contrib/emscripten/fetch.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/contrib/emscripten/request.py | Damian Shaw | 1 |
| tools/vendoring/patches/urllib3-fix-emscripten-import.patch | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/_request_methods.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/http2/__init__.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/http2/connection.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/http2/probe.py | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/py.typed | Damian Shaw | 1 |
| src/pip/_vendor/urllib3/util/util.py | Damian Shaw | 1 |
| src/pip/_vendor/packaging/errors.py | Damian Shaw | 1 |
| .devcontainer/postCreate.sh | Damian Shaw | 1 |
| tests/unit/test_release_control.py | Damian Shaw | 1 |
| tests/unit/test_utils_datetime.py | Damian Shaw | 1 |
| src/pip/_vendor/resolvelib/resolvers/criterion.py | Damian Shaw | 1 |
| src/pip/_vendor/resolvelib/resolvers/exceptions.py | Damian Shaw | 1 |
| tools/vendoring/patches/truststore.patch | Seth Michael Larson | 1 |
| news/14303.bugfix.rst | Edgar Ramírez Mondragón | 1 |
| news/14324.trivial.rst | Kevin Turcios | 1 |
| tests/unit/test_operations_check.py | Kevin Turcios | 1 |
| tests/data/src/extension/extension.c | Miro Hrončok | 1 |
| src/pip/_vendor/distlib/LICENSE.txt | Miro Hrončok | 1 |
| src/pip/_vendor/msgpack/COPYING | Miro Hrončok | 1 |
| src/pip/_vendor/packaging/LICENSE | Miro Hrončok | 1 |
| src/pip/_vendor/packaging/LICENSE.BSD | Miro Hrončok | 1 |
| src/pip/_internal/exceptions/build.py | Richard Si | 1 |
| src/pip/_internal/exceptions/hashes.py | Richard Si | 1 |
| src/pip/_internal/exceptions/network.py | Richard Si | 1 |
| src/pip/_internal/exceptions/uninstall.py | Richard Si | 1 |
| src/pip/_internal/exceptions/wheel.py | Richard Si | 1 |
| news/12248.bugfix.rst | Richard Si | 1 |
| src/pip/_internal/exceptions/pyproject.py | Richard Si | 1 |
| src/pip/_internal/exceptions/_base.py | Richard Si | 1 |
| tests/lib/output.py | Richard Si | 1 |
| tests/unit/test_command_index.py | Richard Si | 1 |
| tests/data/src/python-cmake-issue-13222/setup.py | Richard Si | 1 |
| src/pip/_vendor/idna/__main__.py | Richard Si | 1 |
| src/pip/_vendor/idna/cli.py | Richard Si | 1 |
| tools/vendoring/patches/cachecontrol.patch | Richard Si | 1 |
| tests/data/pypi_packages/calver-2025.10.20.tar.gz | Richard Si | 1 |
| tests/data/pypi_packages/trove_classifiers-2025.12.1.14.tar.gz | Richard Si | 1 |
| tests/data/pypi_packages/INITools-0.1.tar.gz | Richard Si | 1 |
| tests/data/pypi_packages/INITools-0.2.tar.gz | Richard Si | 1 |
| tests/data/pypi_packages/django_devserver-0.8.0-py3-none-any.whl | Richard Si | 1 |
| tests/data/pypi_packages/six-1.17.0-py2.py3-none-any.whl | Richard Si | 1 |
| src/pip/_vendor/pyproject_hooks/py.typed | Richard Si | 1 |
| news/13634.bugfix.rst | T.Yamada | 1 |
| news/9456.bugfix.rst | Islam Asabaev | 1 |
| news/14177.trivial.rst | Youngkwang Yang | 1 |
| news/8573.bugfix.rst | Youngkwang Yang | 1 |
| news/13084.bugfix.rst | Youngkwang Yang | 1 |
Primary owner = the author with the most commits to a file. Solely owned = files only that author has touched.
| Author | Files owned | Solely owned | Files touched |
|---|---|---|---|
| Pradyun Gedam | 387 | 72 | 677 |
| Stéphane Bidoul | 111 | 38 | 393 |
| Richard Si | 109 | 26 | 377 |
| Damian Shaw | 66 | 36 | 357 |
| Marcus Smith | 62 | 55 | 122 |
| Tzu-ping Chung | 41 | 3 | 216 |
| Jon Dufresne | 30 | 1 | 260 |
| Donald Stufft | 27 | 5 | 205 |
| Paul Moore | 20 | 16 | 261 |
| Benoit Pierre | 20 | 20 | 86 |
| Chris Jerdonek | 19 | 0 | 105 |
| Chris Hunt | 16 | 3 | 154 |
| Seth Michael Larson | 12 | 1 | 27 |
| Thomas Kluyver | 7 | 4 | 28 |
| Sepehr Rasouli | 7 | 4 | 24 |
| Nicole Harris | 7 | 5 | 18 |
| Xavier Fernandez | 6 | 5 | 108 |
| Miro Hrončok | 6 | 5 | 44 |
| Robert Collins | 6 | 6 | 21 |
| Sumana Harihareswara | 6 | 0 | 17 |
| Youngkwang Yang | 5 | 3 | 29 |
| Marc Abramowitz | 5 | 5 | 18 |
| Hugo van Kemenade | 4 | 0 | 282 |
| Nate Prewitt | 4 | 2 | 36 |
| Min RK | 4 | 4 | 21 |
Files touched by the most people — shared code where changes are most likely to need coordination.
| File | Contributors | Primary owner | Owner share |
|---|---|---|---|
| tests/functional/test_install.py | 80 | Pradyun Gedam | 13.0% |
| src/pip/_internal/cli/cmdoptions.py | 68 | Stéphane Bidoul | 10.0% |
| src/pip/_internal/utils/misc.py | 54 | Chris Jerdonek | 13.9% |
| docs/html/user_guide.rst | 53 | Sumana Harihareswara | 18.7% |
| tests/unit/test_req.py | 52 | Pradyun Gedam | 15.2% |
| src/pip/_internal/commands/install.py | 51 | Pradyun Gedam | 18.5% |
| tests/functional/test_install_reqs.py | 51 | Pradyun Gedam | 11.8% |
| tests/lib/__init__.py | 49 | Donald Stufft | 10.4% |
| src/pip/_internal/req/req_install.py | 45 | Pradyun Gedam | 27.5% |
| tests/conftest.py | 43 | Pradyun Gedam | 12.4% |
| tests/unit/test_wheel.py | 41 | Chris Hunt | 24.2% |
| tests/unit/test_utils.py | 41 | Chris Jerdonek | 17.9% |
| tests/unit/test_req_file.py | 40 | Marcus Smith | 18.9% |
| tests/functional/test_freeze.py | 40 | Chris Jerdonek | 10.2% |
| tests/functional/test_download.py | 37 | Chris Hunt | 11.2% |
| src/pip/_vendor/vendor.txt | 35 | Pradyun Gedam | 37.5% |
| tests/unit/test_vcs.py | 35 | Chris Jerdonek | 34.5% |
| src/pip/_internal/req/req_file.py | 35 | Pradyun Gedam | 15.8% |
| src/pip/_internal/operations/prepare.py | 33 | Chris Hunt | 32.5% |
| AUTHORS.txt | 33 | Pradyun Gedam | 17.2% |
How pip compares with other Python open source projects →
How pip ranks among Python open source projects by AI-assisted commits →
Generate this report for your own repository with gitstats-action · All Gallery reports
Publishes the report to GitHub Pages on every push to main: turn on Pages for the gh-pages branch.
# .github/workflows/gitstats.yml
name: GitStats Report
on:
push:
branches: [main]
permissions:
contents: write
jobs:
gitstats:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: shenxianpeng/gitstats-action@v1
with:
deploy-to-pages: true