{"library":"pygit2","title":"pygit2","description":"pygit2 is a set of Python bindings for libgit2, a portable, pure C implementation of the Git core methods. It provides a low-level, plumbing-focused API for interacting with Git repositories. The library is actively maintained, with version 1.19.2 being the latest as of March 2026, and typically sees multiple minor releases per year, often in sync with libgit2 updates and bug fixes. It supports Python versions 3.11 through 3.14, and PyPy3 7.3+.","language":"python","status":"active","last_verified":"Wed May 13","install":{"commands":["pip install pygit2"],"cli":null},"imports":["from pygit2 import Repository","from pygit2 import init_repository","from pygit2 import Signature","from pygit2 import GitError","from pygit2 import enums"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pygit2\nimport os\nimport shutil\nimport tempfile\nfrom pygit2 import enums\n\ndef create_and_commit_repo():\n    # Create a temporary directory for the repository\n    repo_path = tempfile.mkdtemp()\n    print(f\"Creating repository at: {repo_path}\")\n\n    try:\n        # Initialize a new bare repository\n        # For a non-bare repo with a working directory, use `bare=False`\n        repo = pygit2.init_repository(repo_path, bare=False)\n\n        # Configure author and committer details\n        author = pygit2.Signature(\"Test User\", \"test@example.com\")\n        committer = pygit2.Signature(\"Test User\", \"test@example.com\")\n\n        # Create a file in the working directory\n        file_path = os.path.join(repo_path, \"README.md\")\n        with open(file_path, \"w\") as f:\n            f.write(\"# My New Repository\\n\\nThis is a test repository.\")\n\n        # Add the file to the index\n        repo.index.add(\"README.md\")\n        repo.index.write()\n\n        # Create a tree from the index\n        tree = repo.index.write_tree()\n\n        # Create the initial commit\n        # For an initial commit, the parents list is empty, and HEAD is used\n        commit_id = repo.create_commit(\n            'HEAD',              # Reference to update\n            author,              # Author signature\n            committer,           # Committer signature\n            'Initial commit',    # Commit message\n            tree,                # Tree object for the commit\n            []                   # Parent commits (empty for initial commit)\n        )\n\n        print(f\"Initial commit created with ID: {commit_id}\")\n\n        # Checkout the branch to populate the working directory\n        repo.checkout('refs/heads/main') # Or 'refs/heads/master' depending on default branch\n        print(f\"Repository content in working directory: {os.listdir(repo_path)}\")\n\n    finally:\n        # Clean up the temporary directory\n        shutil.rmtree(repo_path)\n        print(f\"Cleaned up repository at: {repo_path}\")\n\nif __name__ == \"__main__\":\n    create_and_commit_repo()","lang":"python","description":"This quickstart demonstrates how to initialize a new Git repository, create a file, add it to the index, and make the first commit using pygit2. It also includes cleanup of the temporary repository directory.","tag":null,"tag_description":null,"last_tested":"2026-04-25","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-13","installed_version":"1.15.1","pypi_latest":"1.19.2","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.1,"avg_import_s":0.16,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.13,"mem_mb":4.7,"disk_size":"34.3M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.7,"disk_size":"34.3M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.1,"import_time_s":0.08,"mem_mb":4.7,"disk_size":"35M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.1,"mem_mb":4.7,"disk_size":"35M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.21,"mem_mb":5.3,"disk_size":"37.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":5.3,"disk_size":"37.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.1,"import_time_s":0.18,"mem_mb":5.3,"disk_size":"39M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":5.3,"disk_size":"39M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.15,"mem_mb":5.2,"disk_size":"29.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.19,"mem_mb":5.2,"disk_size":"29.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.16,"mem_mb":5.2,"disk_size":"30M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":5.2,"disk_size":"30M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.14,"mem_mb":5.4,"disk_size":"29.2M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.17,"mem_mb":5.4,"disk_size":"29.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.16,"mem_mb":5.4,"disk_size":"30M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":5.4,"disk_size":"30M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":3.8,"disk_size":"33.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":3.8,"disk_size":"33.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.07,"mem_mb":3.8,"disk_size":"34M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pygit2","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":3.8,"disk_size":"34M"}]}}