René's URL Explorer Experiment


Title: Git.{AutoInterrupt,CatFileContentStream} refactor broke static typing · Issue #2038 · gitpython-developers/GitPython · GitHub

Open Graph Title: Git.{AutoInterrupt,CatFileContentStream} refactor broke static typing · Issue #2038 · gitpython-developers/GitPython

X Title: Git.{AutoInterrupt,CatFileContentStream} refactor broke static typing · Issue #2038 · gitpython-developers/GitPython

Description: #2037 accidentally introduced 30 new mypy errors, more than doubling the total number that occur on most recent versions of Python from 27 to 57 (or from 28 to 58 in Python 3.13): diff --git a/a b/b index 128f3547..59913c9c 100644 --- a/...

Open Graph Description: #2037 accidentally introduced 30 new mypy errors, more than doubling the total number that occur on most recent versions of Python from 27 to 57 (or from 28 to 58 in Python 3.13): diff --git a/a b/...

X Description: #2037 accidentally introduced 30 new mypy errors, more than doubling the total number that occur on most recent versions of Python from 27 to 57 (or from 28 to 58 in Python 3.13): diff --git a/a b/...

Opengraph URL: https://github.com/gitpython-developers/GitPython/issues/2038

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Git.{AutoInterrupt,CatFileContentStream} refactor broke static typing","articleBody":"#2037 accidentally introduced 30 new `mypy` errors, more than doubling the total number that occur on most recent versions of Python from 27 to 57 (or from 28 to 58 in Python 3.13):\n\n```diff\ndiff --git a/a b/b\nindex 128f3547..59913c9c 100644\n--- a/a\n+++ b/b\n@@ -1,33 +1,82 @@\n git\\types.py:133: error: Type[...] can't contain \"Union[Literal[...], Literal[...]]\"  [valid-type]\n+git\\util.py:508: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\util.py:508: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\util.py:512: error: Item Git.AutoInterrupt? of \"Union[Popen[Any], Git.AutoInterrupt?]\" has no attribute \"wait\"  [union-attr]\n git\\util.py:1146: error: Variance of TypeVar \"T_IterableObj\" incompatible with variance in parent type  [type-var]\n git\\util.py:1217: error: Argument 2 to \"getattr\" has incompatible type \"Union[SupportsIndex, str]\"; expected \"str\"  [arg-type]\n git\\util.py:1219: error: Unsupported operand types for + (\"str\" and \"SupportsIndex\")  [operator]\n git\\util.py:1219: note: Right operand is of type \"Union[SupportsIndex, str]\"\n git\\util.py:1226: error: Unsupported operand types for + (\"str\" and \"SupportsIndex\")  [operator]\n git\\util.py:1226: error: Unsupported operand types for + (\"str\" and \"slice[Any, Any, Any]\")  [operator]\n git\\util.py:1226: note: Right operand is of type \"Union[SupportsIndex, slice[Any, Any, Any], str]\"\n git\\config.py:572: error: If x = b'abc' then f\"{x}\" or \"{}\".format(x) produces \"b'abc'\", not \"abc\". If this is desired behavior, use f\"{x!r}\" or \"{!r}\".format(x). Otherwise, decode the bytes  [str-bytes-safe]\n git\\config.py:628: error: Redundant cast to \"Union[str, PathLike[str]]\"  [redundant-cast]\n+git\\cmd.py:98: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:98: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:106: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:106: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:170: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:170: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:218: error: Unused \"type: ignore\" comment  [unused-ignore]\n+git\\cmd.py:510: error: Variable \"git.cmd.Git.CatFileContentStream\" is not valid as a type  [valid-type]\n+git\\cmd.py:510: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1051: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1051: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1108: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1108: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1528: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1528: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1533: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1533: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1537: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1537: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1658: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1658: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1668: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1668: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1671: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\cmd.py:1671: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1672: error: Git.AutoInterrupt? has no attribute \"stdin\"  [attr-defined]\n+git\\cmd.py:1672: error: Git.AutoInterrupt? has no attribute \"stdout\"  [attr-defined]\n+git\\cmd.py:1673: error: Git.AutoInterrupt? has no attribute \"stdin\"  [attr-defined]\n+git\\cmd.py:1674: error: Git.AutoInterrupt? has no attribute \"stdin\"  [attr-defined]\n+git\\cmd.py:1675: error: Git.AutoInterrupt? has no attribute \"stdout\"  [attr-defined]\n+git\\cmd.py:1703: error: Git.CatFileContentStream? has no attribute \"read\"  [attr-defined]\n+git\\cmd.py:1707: error: Variable \"git.cmd.Git.CatFileContentStream\" is not valid as a type  [valid-type]\n+git\\cmd.py:1707: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\cmd.py:1719: error: Git.AutoInterrupt? has no attribute \"stdout\"  [attr-defined]\n git\\refs\\log.py:148: error: Argument 1 to \"RefLogEntry\" has incompatible type \"Tuple[str, str, Actor, Tuple[int, int], Optional[str]]\"; expected \"Iterable[Union[str, Actor, Tuple[int, int]]]\"  [arg-type]\n+git\\diff.py:584: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\diff.py:584: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n git\\objects\\submodule\\base.py:834: error: \"SymbolicReference\" has no attribute \"set_tracking_branch\"  [attr-defined]\n git\\objects\\submodule\\base.py:862: error: \"SymbolicReference\" has no attribute \"tracking_branch\"  [attr-defined]\n+git\\objects\\commit.py:454: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\objects\\commit.py:454: note: Error code \"valid-type\" not covered by \"type: ignore\" comment\n+git\\objects\\commit.py:454: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\objects\\commit.py:459: error: Git.AutoInterrupt? has no attribute \"communicate\"  [attr-defined]\n git\\objects\\commit.py:711: error: Argument 2 to \"create\" of \"SymbolicReference\" has incompatible type \"Callable[[], SymbolicReference]\"; expected \"Union[str, PathLike[str]]\"  [arg-type]\n git\\objects\\commit.py:903: error: Argument 2 to \"findall\" has incompatible type \"Union[str, bytes]\"; expected \"str\"  [arg-type]\n git\\refs\\symbolic.py:919: error: Incompatible types in assignment (expression has type \"SymbolicReference\", variable has type \"T_References\")  [assignment]\n git\\refs\\tag.py:48: error: Read-only property cannot override read-write property  [misc]\n git\\refs\\tag.py:49: error: Unused \"type: ignore\" comment  [unused-ignore]\n git\\refs\\tag.py:83: error: Read-only property cannot override read-write property  [misc]\n git\\refs\\tag.py:84: error: Unused \"type: ignore\" comment  [unused-ignore]\n git\\refs\\head.py:48: error: Incompatible override of a setter type  [override]\n git\\refs\\head.py:48: note:  (base class \"SymbolicReference\" defined the type as \"Union[Commit, SymbolicReference, str]\",\n git\\refs\\head.py:48: note:  override has type \"Commit\")\n git\\refs\\head.py:48: note:  Setter types should behave contravariantly\n+git\\remote.py:874: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\remote.py:874: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\remote.py:902: error: Git.AutoInterrupt? has no attribute \"wait\"  [attr-defined]\n+git\\remote.py:945: error: Variable \"git.cmd.Git.AutoInterrupt\" is not valid as a type  [valid-type]\n+git\\remote.py:945: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases\n+git\\remote.py:975: error: Git.AutoInterrupt? has no attribute \"wait\"  [attr-defined]\n git\\repo\\fun.py:289: error: \"Callable[[], SymbolicReference]\" has no attribute \"commit\"  [attr-defined]\n git\\repo\\fun.py:339: error: \"Callable[[], SymbolicReference]\" has no attribute \"log_entry\"  [attr-defined]\n git\\repo\\base.py:688: error: Redundant cast to \"Literal['system', 'global', 'user', 'repository']\"  [redundant-cast]\n git\\repo\\base.py:690: error: Redundant cast to \"Literal['system', 'global', 'user', 'repository']\"  [redundant-cast]\n git\\repo\\base.py:1054: error: Incompatible return value type (got \"SymbolicReference\", expected \"Head\")  [return-value]\n git\\repo\\base.py:1487: error: Argument 5 to \"_clone\" of \"Repo\" has incompatible type \"Optional[Optional[Callable[[int, Union[str, float], Union[str, float, None], str], None]]]\"; expected \"Union[RemoteProgress, UpdateProgress, Callable[..., RemoteProgress], None]\"  [arg-type]\n git\\repo\\base.py:1548: error: Argument 5 to \"_clone\" of \"Repo\" has incompatible type \"Optional[Callable[[int, Union[str, float], Union[str, float, None], str], None]]\"; expected \"Union[RemoteProgress, UpdateProgress, Callable[..., RemoteProgress], None]\"  [arg-type]\n test\\deprecation\\test_basic.py:137: error: Argument \"change_type\" to \"iter_change_type\" of \"DiffIndex\" has incompatible type \"str\"; expected \"Literal['A', 'D', 'C', 'M', 'R', 'T', 'U']\"  [arg-type]\n-Found 27 errors in 12 files (checked 44 source files)\n+Found 57 errors in 15 files (checked 44 source files)\n```\n\nThe problem is that, as described in [Variables vs type aliases](https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases), `mypy` only recognizes assignments to create type aliases when they are a module level, when `TypeAlias` is used, or when the Python 3.12+ `type` syntax is used. This is at class level, `TypeAlias` is not used, and `type` is not used (and can't be used, because we support versions of Python below 3.12).\n\nSo even though Sphinx would readily recognize these as type aliases (hence the need to change `__name__` and `__qualname__`) when we didn't want it to do so, `mypy` would not recognize them as type aliases even though we do want to either to do so (or to recognize them as nested classes, but I don't think that's feasible to have a static type-checker do, and it may not be desirable).\n\n**This will actually affect users** unless it is fixed before the next release is made, because `Git.AutoInterrupt` and `Git.CatFileContentStream` are public types that users are supposed to be able to access directly.\n\nI'm aware of several possible solutions, some better than others:\n\n1. Revert [#2037](https://github.com/gitpython-developers/GitPython/pull/2037). This is the simplest solution, but we forgo its organizational benefits. On the other hand, this problem might be viewed as an argument that the tradeoffs aren't worth it.\n\n2. Use `TypeAlias`, in an annotation, e.g. `AutoInterrupt: TypeAlias = _AutoInterrupt`. This is the obvious solution, and it seems to work fine. But the problem is that `TypeAlias` is only available in the standard library `typing` module since Python 3.10. Before that, it can be obtained from the `typing_extensions` package. But that package is currently only a dependency of `GitPython` when using Python 3.7.\n\n   I wouldn't hesitate even slightly to require `typing_extensions` for Python 3.8, which like 3.7 is end-of-life (no longer supported by the Python Software Foundation). People should avoid using EoL versions of Python, and should expect a somewhat degraded experience when doing so. But one of the long-standing benefits of GitPython is its minimal dependencies, so I'm reluctant to impose new ones on users of non-EoL versions without good reason.\n\n   However, `typing_extensions` is ubiquitous, so I wouldn't expect this to lead to problems for users/developers, nor for downstream packagers (operating systems that package `GitPython` surely package `typing_extensions` too). I think this is the way to go unless further complexities arise when doing it.\n\n3. Actually make `AutoInterrupt` and `CatFileContentStream` top-level classes, and refer to them directly as such. For consistency with the usual expectations for conceptually public top-level classes of modules GitPython, we would probably also expose them in the top-level `git` module, by placing `import` statements and `__all__` entires for them in `__init__.py`; but whether or not we did so, this is a change that would be non-breaking to implement but breaking to revert, if reverted after a release is made.\n\n   Abstractly speaking, the main problem here is that, unless it's combined with something like (2), it is an incomplete solution: the `Git` class will still need to contain aliases, and these will conceptually be aliases. In a sense, this even *causes* them to conceptually be aliases, in that their relationship to another type that is part of the public interface would be more than an implementation detail. So they should be treated as aliases, not variables, by the type system.\n\n   Concretely speaking, the main problem here is that **code outside GitPython would still get the `mypy` errors**, it would just have a way to make them go away. That's sometimes acceptable or even good--the point of static type checking is to find errors--but in this case the errors don't correspond to actual problems in the client code where they would arise. Therefore, I think that while it may be that this should be done eventually, it shouldn't be done as part of solving this bug.\n\n   (Also, do we intend that users/developers be able to customize the behavior of these classes by making a class that derives from `Git` that introduces new classes called `AutoInterrupt` and `CatFileContentStream` that inherit from `Git.AutoInterrupt` and `Git.CatFileContentStream`? If so, then we would have to be careful about where we use the module-level classes and where we use the `Git` member aliases, even though we intend them to be interchangeable.)\n\n4. Change the top-level nonpublic `_AutoInterrupt` and `_CatFileContentStream` to `_AutoInterruptBase` and `_CatFileContentStreamBase`, define `AutoInterrupt` and `CatFileContentStream` as nested classes that inherit from them (and introduce derived `__slots__ = ()` to avoid introducing `__dict__`s), and move the docstrings into the derived actually-nested classes.\n\n   This seems like it would be more confusing to work with when maintaining GitPython, and I am not confident that it will automatically preserve the intended effect with Sphinx, though it probably would. This is also arguably not a situation where the use of inheritance is warranted. But I can definitely look into this further if you think it might be preferable to (2).\n\n5. Hacky ways to get `mypy` to recognize the classes as type aliases. For example, maybe placing them in another module and writing `import` statements for them inside the `Git` class would work! I think the badness of such approaches is self-evident, but in this case doing something like that would also have no clear benefit over (1), since it would place the classes' substantive definitions in an inconvenient and unintuitive place that would decrease readability.\n\nIf (2) is done, we can still revert both it and #2037 to get (1). So I'll do (2) unless further problems arise with it, with the idea that adding a `typing_extensions` dependency for more versions of Python, even one non-EoL version, may be acceptable.\n\n*Edit:* This is done in #2039.","author":{"url":"https://github.com/EliahKagan","@type":"Person","name":"EliahKagan"},"datePublished":"2025-06-07T15:32:45.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/2038/GitPython/issues/2038"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:50651250-8252-ed60-0617-24cc2a2c5fec
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idCF98:25046C:962CD:D1AB7:6968B51D
html-safe-nonce4030d1cc591e85484dca909a6bfd4b3a849b2e9d21a2ad85229b698c8c623e9b
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDRjk4OjI1MDQ2Qzo5NjJDRDpEMUFCNzo2OTY4QjUxRCIsInZpc2l0b3JfaWQiOiIzMTI3Mzg1MzczMjY4MjkyODkzIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac2335f372e166252e4e6fd06e951e7a2165b7d118eac37315278bd3fd4dfba2e0
hovercard-subject-tagissue:3127174728
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/gitpython-developers/GitPython/2038/issue_layout
twitter:imagehttps://opengraph.githubassets.com/f1f3a3857b7f4ffe9fb6a55c095e7914aedd91ed681963265136806f4f8966db/gitpython-developers/GitPython/issues/2038
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/f1f3a3857b7f4ffe9fb6a55c095e7914aedd91ed681963265136806f4f8966db/gitpython-developers/GitPython/issues/2038
og:image:alt#2037 accidentally introduced 30 new mypy errors, more than doubling the total number that occur on most recent versions of Python from 27 to 57 (or from 28 to 58 in Python 3.13): diff --git a/a b/...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameEliahKagan
hostnamegithub.com
expected-hostnamegithub.com
Nonefdc7c66bd36a6c12eb8e771e806db863266e573fc299e77f27505a768d4f8a98
turbo-cache-controlno-preview
go-importgithub.com/gitpython-developers/GitPython git https://github.com/gitpython-developers/GitPython.git
octolytics-dimension-user_id503709
octolytics-dimension-user_logingitpython-developers
octolytics-dimension-repository_id1126087
octolytics-dimension-repository_nwogitpython-developers/GitPython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1126087
octolytics-dimension-repository_network_root_nwogitpython-developers/GitPython
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release3223a6503d318917691422cdadfbe16cd8fb21e5
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/gitpython-developers/GitPython/issues/2038#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fissues%2F2038
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fissues%2F2038
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=gitpython-developers%2FGitPython
Reloadhttps://github.com/gitpython-developers/GitPython/issues/2038
Reloadhttps://github.com/gitpython-developers/GitPython/issues/2038
Reloadhttps://github.com/gitpython-developers/GitPython/issues/2038
gitpython-developers https://github.com/gitpython-developers
GitPythonhttps://github.com/gitpython-developers/GitPython
Please reload this pagehttps://github.com/gitpython-developers/GitPython/issues/2038
Notifications https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Fork 964 https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Star 5k https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Code https://github.com/gitpython-developers/GitPython
Issues 169 https://github.com/gitpython-developers/GitPython/issues
Pull requests 8 https://github.com/gitpython-developers/GitPython/pulls
Discussions https://github.com/gitpython-developers/GitPython/discussions
Actions https://github.com/gitpython-developers/GitPython/actions
Security Uh oh! There was an error while loading. Please reload this page. https://github.com/gitpython-developers/GitPython/security
Please reload this pagehttps://github.com/gitpython-developers/GitPython/issues/2038
Insights https://github.com/gitpython-developers/GitPython/pulse
Code https://github.com/gitpython-developers/GitPython
Issues https://github.com/gitpython-developers/GitPython/issues
Pull requests https://github.com/gitpython-developers/GitPython/pulls
Discussions https://github.com/gitpython-developers/GitPython/discussions
Actions https://github.com/gitpython-developers/GitPython/actions
Security https://github.com/gitpython-developers/GitPython/security
Insights https://github.com/gitpython-developers/GitPython/pulse
New issuehttps://github.com/login?return_to=https://github.com/gitpython-developers/GitPython/issues/2038
New issuehttps://github.com/login?return_to=https://github.com/gitpython-developers/GitPython/issues/2038
#2039https://github.com/gitpython-developers/GitPython/pull/2039
Git.{AutoInterrupt,CatFileContentStream} refactor broke static typinghttps://github.com/gitpython-developers/GitPython/issues/2038#top
#2039https://github.com/gitpython-developers/GitPython/pull/2039
https://github.com/EliahKagan
https://github.com/EliahKagan
EliahKaganhttps://github.com/EliahKagan
on Jun 7, 2025https://github.com/gitpython-developers/GitPython/issues/2038#issue-3127174728
#2037https://github.com/gitpython-developers/GitPython/pull/2037
Variables vs type aliaseshttps://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
#2037https://github.com/gitpython-developers/GitPython/pull/2037
#2037https://github.com/gitpython-developers/GitPython/pull/2037
#2039https://github.com/gitpython-developers/GitPython/pull/2039
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.