René's URL Explorer Experiment
Title: Run more submodule tests on Cygwin (fix flaky xfails) by EliahKagan · Pull Request #2154 · gitpython-developers/GitPython · GitHub
Open Graph Title: Run more submodule tests on Cygwin (fix flaky xfails) by EliahKagan · Pull Request #2154 · gitpython-developers/GitPython
X Title: Run more submodule tests on Cygwin (fix flaky xfails) by EliahKagan · Pull Request #2154 · gitpython-developers/GitPython
Description: In #1455, which got Cygwin tests running on GitHub Actions, DWesl mentioned:
I have three test failures left that I don't understand, and hope someone here knows what's going on.
Byron's review mentioned:
The failures are all related to submodule handling, and I think that functionality isn't necessarily widely used anymore.
Further discussion raised the question of whether this was the case, as well as workarounds for using submodules on Cygwin even if submodule-specific functionality is broken. The tests were marked xfail (54bae76, 0eda0a5, 7f3689d) and the PR was merged.
It turns out the GitPython submodule functionality is not broken on Cygwin, and neither are the tests! Instead, the problem is that the rorepo fixture is GitPython's own repository, and when actions/checkout clones GitPython, the top-level gitdb directory is owned by the Administrators rather than the runneradmin user. Git for Windows special-cases this, judging that repositories owned by the Administrators group are safe for members of that group to trust. Cygwin git does not special-case this, so more safe.directory entries are needed to assuage it.
The key to identifying the cause of the problem is that only tests that use self.rorepo and attempt submodule operations, but not those using @with_rw_repo and attempting submodule operations, failed in this way. The nature of the problem was obscured by several oddities, though the fourth and final oddity is also what revealed it:
The subtleties of safe.directory protections on Windows are unintuitive and complex even in cases where they work fully as intended, only one Git implementation is involved, and CI behavior is likely to match local behavior, none of which hold here.
Whether actions/checkout clones the submodules, or leaves them to be cloned by init-tests-after-clone.sh, is irrelevant to all aspects of this problem. This is even though the action uses Git for Windows, while the init script (in a Cygwin job) uses Cygwin git. The git/ext/gitdb directory is created when checking out GitPython itself, and it is owned by Administrators.
The dubious ownership happens in a git cat-file --batch-check invocation we intend to reuse across operations. The git subprocess quits before reading its input. Currently GitPython issues a message about possible dubious ownership in this situation, since that's the most common cause. But it is not the only possible cause of that message from GitPython--so if one does not expect that the error is due to safe.directory protections, then one might dismiss that.
We run git cat-file --batch-check and send refs through the pipe. But if there is dubious ownership, then the git process quits before reading its input. So there is a race condition: our write may fail with EPIPE and raise BrokenPipeError, or our read may complete with EOF, such that we pass b"" to _parse_object_header, which raises ValueError.
BrokenPipeError is a subclass of IOError, and we currently swallow IOError in some of the places where this happens. The ValueError case is overwhelmingly more common. That's the xfail decorations from #1455 covered. Recently, EPIPE wins the race slightly more often than in the past, and we've had to rerun tests a number of times. It would be possible to add more exception types to the xfail decorations, but a better approach is to verify the complete details of what is going wrong and why, add more regression tests, and fix the problem properly, removing the xfails. This PR does those things.
The fix is very simple: we already have a CI step that adds paths to the Cygwin git safe.directory configuration, and the fix is to add the missing paths related to submodules. But the tests are somewhat nontrivial, and the partially reverted instrumentation to fully confirm the cause and facilitate easier debugging in the future is also somewhat nontrivial.
The code changes and commit messages in this PR were made with Claude Code, as disclosed in commit message trailers. I've reviewed and substantially adjusted the code changes. I've also reviewed and honed the commit messages through many rounds of revision, including manual edits. A few of the commit messages are long and dense. I have made sure to spend more time with those, to ensure I believe the details are warranted, since even though I am well known for writing long detailed commit messages, I understand this is something people are more wary of when LLMs are involved (since they can generate large amounts of text quickly). As for this PR description, no part of it is LLM-generated, though I did use Claude for proofreading.
The commit messages describe the situation, the evidence for it, and the fix from the perspective of tracing what has occurred. One aspect of the bug--the behavior of safe.directory protections on Windows when multiple git implementations are used and the repository has submodules that it must operate on--is particularly non-obvious, unintuitive, and interesting, and it may end up being relevant to future improvements here in GitPython, as well as to submodule portability subtleties that might arise in the future in gitoxide. Hence this section.
On POSIX, the owner and group owner of a file are separate concepts, with each file being owned by one user and group-owned by one group. But on Windows there is a unified concept of Owner. Unlike on a Unix-like system, on Windows a user or a group can own a file in the same sense of "own." Users usually own the files they create, but one of the exceptions to this is that users who are members of the Administrators group create files that are owned by the Administrators group. This exception is actually more specific than that: it only applies when the user is actually running with their unfiltered (full) token in which the Administrators group is active. Usually, members of the Administrators group on Windows run with UAC enabled and configured to require elevation to act with their full administrative powers. But the runneradmin user that runs Windows CI jobs runs with a full admin token, so files it creates are owned by Administrators.
Git uses ownership as a powerful trust signal. It will operate on repositories it thinks the user running it owns, since the configuration and hooks in such a repository are presumably safe. Git checks if some important repository paths, such as the repo's top-level directory and its .git dir, have the user running it as their owner. If they do, it trusts the repository. For any not owned, it checks if they match any values of the safe.directory configuration variable. If any are neither owned by the user nor match entries in safe.directory, then Git refuses to operate. But this gets weird on Windows, where the directories might be owned by something that isn't a user at all:
Git for Windows lets members of the Administrators group operate on repositories whose ownership matches what those users might very well create themselves. If the user is in Administrators, and a directory is owned by Administrators, then Git for Windows considers it to be owned by the user for purpose of assessing trust.
Cygwin git does not do this. It doesn't generally need to. If you start a program built against cygwin1.dll--whether that program is git or anything else--it changes the owner of the process token to the user, and then the owner inherited by securable objects (such as files) the process creates is the user instead of whatever it was before. So a member of the Administrators group, acting with the full powers thereof, can run Cygwin git with Administrators as the process token owner initially--but the process token owner is changed to the user, almost immediately, before Cygwin git's main() function is called. For this reason, Cygwin git typically has no need to treat repositories owned by the Administrators group specially--it never creates such a repository.
When we clone a repository that has a submodule, we may or may not also clone the submodule. If we do, we might clone it at the same time, or later. But whatever happens, so long as the top-level repository is able to be checked out, we first get the top-level repository with an empty directory at the submodule root. Whatever ownership we are creating files with, we create the submodule root with that ownership.
In all our Windows CI jobs, including the Cygwin jobs, we use actions/checkout to clone. While actions/checkout is capable of cloning repositories using the GitHub REST API, it only uses this as a fallback strategy. It first checks if a recent enough version of git is available and, if so, uses it. On all our Windows CI jobs, including the Cygwin jobs, actions/checkout clones the GitPython repository using Git for Windows.
Thus, no matter how its submodules are cloned, the top-level directory of gitdb is owned by the Administrators group. Cygwin git would therefore refuse to operate on it. But the GitPython test suite uses the GitPython repository itself, as well as its direct submodule gitdb and its nested submodule smmap, as test fixtures. Because Cygwin git wouldn't operate on the gitdb submodule, tests that use it were failing.
Most submodule tests didn't have a problem, because they use @with_rw_repo, which creates a new clone, instead of self.rorepo, which uses the repository in place. On Cygwin, @with_rw_repo clones the repository with Cygwin git. As described above, when Cygwin git clones repositories, it clones them as the user.
More remarkably, while I have added safe.directory entries for the nested smmap module, this is actually not strictly necessary--smmap never had dubious ownership! The reason is that only the gitdb directory created in the top-level GitPython checkout is owned by Administrators. No contents of submodules, not even of the gitdb submodule, are checked out as owned by Administrators. This is the case even if actions/checkout is made to clone them all by setting submodules: recursive. (I tested with this to be sure. But I did not keep this, since we have good reasons to validate that our init script will clone the submodules even if they were not cloned before. See #1713 and #1715 on this.) That is to say that none of the files created when cloning submodules are owned by Administrators even when Git for Windows creates them in the same top-level git clone command.
How can this be? Historically, the machinery that operated on submodules was implemented in scripts. Over time, it basically all came to be implemented in C, except that the git-submodule subcommand itself remains implemented by git-submodule.sh. Today, the major functionality of the script is to parse options, apply defaults, look up some information about the current repository, and call git submodule--helper to do the real work. In Git for Windows, the C code that does the real work is in native Windows programs such as git.exe. But git-submodule.sh is a shell script. Its interpreter is sh.exe from the MSYS2 "Git Bash" environment that Git for Windows ships.
MSYS2 is like Cygwin (MSYS2 is a fork of MSYS, which is a fork of Cygwin). Just as Cygwin programs link to cygwin1.dll, which does various setup--including, as described above, resetting the process's token owner to the user--MSYS2 programs link to msys-2.0.dll, which does that very same thing. Therefore, a user who is a member of the Administrators group can run git with Administrators as its process token owner, but in any chain of subprocesses that goes through a shell invocation, everything at or below that invocation will operate with it reset to the user.
Open Graph Description: In #1455, which got Cygwin tests running on GitHub Actions, DWesl mentioned:
I have three test failures left that I don't understand, and hope someone here knows what's going on.
Byron...
X Description: In #1455, which got Cygwin tests running on GitHub Actions, DWesl mentioned:
I have three test failures left that I don't understand, and hope someone here knows what's going on.
...
Opengraph URL: https://github.com/gitpython-developers/GitPython/pull/2154
X: @github
direct link
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:c1ca9bf5-3134-814c-376f-5dab3dcfff65 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | E000:3A479:15F49A6:1D7071C:6A59692B |
| html-safe-nonce | 47b0178064b150197943098621b84f0b3355d95b7cd79b96578308b9d50cd914 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFMDAwOjNBNDc5OjE1RjQ5QTY6MUQ3MDcxQzo2QTU5NjkyQiIsInZpc2l0b3JfaWQiOiIyNjQ2MTgwNjUwODE3NTU5NDgiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 8d99c6e3d12df94a90eaf38519b299dbe8e2b74e0983154a8483d1c34367b9c9 |
| hovercard-subject-tag | pull_request:3699792301 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | ///pull_requests/show/files |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/gitpython-developers/GitPython/pull/2154/files |
| twitter:image | https://avatars.githubusercontent.com/u/1771172?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/1771172?s=400&v=4 |
| og:image:alt | In #1455, which got Cygwin tests running on GitHub Actions, DWesl mentioned:
I have three test failures left that I don't understand, and hope someone here knows what's going on.
Byron... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | a540949572872b935b393b36db38922db390ae71c859537d741b8f3eb7e545b5 |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/gitpython-developers/GitPython git https://github.com/gitpython-developers/GitPython.git |
| octolytics-dimension-user_id | 503709 |
| octolytics-dimension-user_login | gitpython-developers |
| octolytics-dimension-repository_id | 1126087 |
| octolytics-dimension-repository_nwo | gitpython-developers/GitPython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1126087 |
| octolytics-dimension-repository_network_root_nwo | gitpython-developers/GitPython |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 4aa391d605ba491481565840251a4b0fec3f4807 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
| Skip to content | https://github.com/gitpython-developers/GitPython/pull/2154/files#start-of-content |
|
| https://github.com/ |
|
Sign in
| https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F2154%2Ffiles |
| GitHub CopilotWrite better code with AI | https://github.com/features/copilot |
| GitHub Copilot appDirect agents from issue to merge | https://github.com/features/ai/github-app |
| MCP RegistryNewIntegrate external tools | https://github.com/mcp |
| ActionsAutomate any workflow | https://github.com/features/actions |
| CodespacesInstant dev environments | https://github.com/features/codespaces |
| IssuesPlan and track work | https://github.com/features/issues |
| Code ReviewManage code changes | https://github.com/features/code-review |
| GitHub Advanced SecurityFind and fix vulnerabilities | https://github.com/security/advanced-security |
| Code securitySecure your code as you build | https://github.com/security/advanced-security/code-security |
| Secret protectionStop leaks before they start | https://github.com/security/advanced-security/secret-protection |
| Why GitHub | https://github.com/why-github |
| Documentation | https://docs.github.com |
| Blog | https://github.blog |
| Changelog | https://github.blog/changelog |
| Marketplace | https://github.com/marketplace |
| View all features | https://github.com/features |
| Enterprises | https://github.com/enterprise |
| Small and medium teams | https://github.com/team |
| Startups | https://github.com/enterprise/startups |
| Nonprofits | https://github.com/solutions/industry/nonprofits |
| App Modernization | https://github.com/solutions/use-case/app-modernization |
| DevSecOps | https://github.com/solutions/use-case/devsecops |
| DevOps | https://github.com/solutions/use-case/devops |
| CI/CD | https://github.com/solutions/use-case/ci-cd |
| View all use cases | https://github.com/solutions/use-case |
| Healthcare | https://github.com/solutions/industry/healthcare |
| Financial services | https://github.com/solutions/industry/financial-services |
| Manufacturing | https://github.com/solutions/industry/manufacturing |
| Government | https://github.com/solutions/industry/government |
| View all industries | https://github.com/solutions/industry |
| View all solutions | https://github.com/solutions |
| AI | https://github.com/resources/articles?topic=ai |
| Software Development | https://github.com/resources/articles?topic=software-development |
| DevOps | https://github.com/resources/articles?topic=devops |
| Security | https://github.com/resources/articles?topic=security |
| View all topics | https://github.com/resources/articles |
| Customer stories | https://github.com/customer-stories |
| Events & webinars | https://github.com/resources/events |
| Ebooks & reports | https://github.com/resources/whitepapers |
| Business insights | https://github.com/solutions/executive-insights |
| GitHub Skills | https://skills.github.com |
| Documentation | https://docs.github.com |
| Customer support | https://support.github.com |
| Community forum | https://github.com/orgs/community/discussions |
| Trust center | https://github.com/trust-center |
| Partners | https://github.com/partners |
| View all resources | https://github.com/resources |
| GitHub SponsorsFund open source developers | https://github.com/open-source/sponsors |
| Security Lab | https://securitylab.github.com |
| Maintainer Community | https://maintainers.github.com |
| Accelerator | https://github.com/open-source/accelerator |
| GitHub Stars | https://stars.github.com |
| Archive Program | https://archiveprogram.github.com |
| Topics | https://github.com/topics |
| Trending | https://github.com/trending |
| Collections | https://github.com/collections |
| Enterprise platformAI-powered developer platform | https://github.com/enterprise |
| GitHub Advanced SecurityEnterprise-grade security features | https://github.com/security/advanced-security |
| Copilot for BusinessEnterprise-grade AI features | https://github.com/features/copilot/copilot-business |
| Premium SupportEnterprise-grade 24/7 support | https://github.com/enterprise/premium-support |
| Pricing | https://github.com/pricing |
| Search syntax tips | https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax |
| documentation | https://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%2Fpull%2F2154%2Ffiles |
|
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%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=gitpython-developers%2FGitPython |
| Reload | https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Reload | https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Reload | https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
gitpython-developers
| https://github.com/gitpython-developers |
| GitPython | https://github.com/gitpython-developers/GitPython |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
Notifications
| https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython |
|
Fork
982
| https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython |
|
Star
5.1k
| https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython |
|
Code
| https://github.com/gitpython-developers/GitPython |
|
Issues
164
| https://github.com/gitpython-developers/GitPython/issues |
|
Pull requests
9
| https://github.com/gitpython-developers/GitPython/pulls |
|
Discussions
| https://github.com/gitpython-developers/GitPython/discussions |
|
Actions
| https://github.com/gitpython-developers/GitPython/actions |
|
Security and quality
12
| https://github.com/gitpython-developers/GitPython/security |
|
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 and quality
| https://github.com/gitpython-developers/GitPython/security |
|
Insights
| https://github.com/gitpython-developers/GitPython/pulse |
| Sign up for GitHub
| https://github.com/signup?return_to=%2Fgitpython-developers%2FGitPython%2Fissues%2Fnew%2Fchoose |
| terms of service | https://docs.github.com/terms |
| privacy statement | https://docs.github.com/privacy |
| Sign in | https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython%2Fissues%2Fnew%2Fchoose |
| EliahKagan | https://github.com/EliahKagan |
| gitpython-developers:main | https://github.com/gitpython-developers/GitPython/tree/main |
| EliahKagan:claude/cygwin-safe-directory | https://github.com/EliahKagan/GitPython/tree/claude/cygwin-safe-directory |
|
Conversation
4
| https://github.com/gitpython-developers/GitPython/pull/2154 |
|
Commits
11
| https://github.com/gitpython-developers/GitPython/pull/2154/commits |
|
Checks
30
| https://github.com/gitpython-developers/GitPython/pull/2154/checks |
|
Files changed
| https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
Run more submodule tests on Cygwin (fix flaky xfails)
| https://github.com/gitpython-developers/GitPython/pull/2154/files#top |
|
Show all changes
11 commits
| https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
fa0d9bc
Add a test that fixture directories are usable by git
EliahKagan May 7, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/fa0d9bc17928e7c11dc11c875c1047587f5354c3 |
|
d5fb280
Add a test that required submodules are initialized
EliahKagan May 7, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/d5fb280613feb71a335ae371db1c32d3de09d594 |
|
ce68322
Clearly reproduce Cygwin safe.directory submodule bug
EliahKagan May 6, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/ce68322cc3b3fea4077b3a1800283d00fe4dcb3e |
|
76f0160
Add a diagnostic job demonstrating the TokenOwner mechanism
EliahKagan May 10, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/76f0160681f551b5199edd6dfd005012e65ad6d3 |
|
f368f17
Show file ownership and safe.directory entries on every test job
EliahKagan May 10, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/f368f17d161854cf05d871ef8f48a22ab194bc63 |
|
14cdc52
Restructure CI diagnostic steps
EliahKagan May 17, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/14cdc52fe97bbee17974ddb687b87b3c09af608c |
|
8ef4c21
Add `submodules: recursive` temporarily, for testing
EliahKagan May 10, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/8ef4c21859d61683ac93f679790c23ef1cf4b17d |
|
b409946
Cover submodule working trees in safe.directory on Cygwin
EliahKagan May 7, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/b409946ca7e7c36782b47b54dd5b1f70280e8eab |
|
650eaaf
Remove `submodules: recursive` (testing complete)
EliahKagan May 10, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/650eaafebd44cbe879d60eb8389eacc5db323c63 |
|
de3a950
Remove temporary test jobs (testing complete)
EliahKagan May 10, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/de3a950d57c8057fdd36ead97a390a48180892ee |
|
4dd89af
Match test_root_module's deep-traversal assertion to gitdb's structure
EliahKagan May 17, 2026
| https://github.com/gitpython-developers/GitPython/pull/2154/commits/4dd89aff2896f63f8d7e61ef3736b1b60e386d16 |
|
Clear filters
| https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
alpine-test.yml
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-efd10bfc61f6e81e7ddbeefd3bdeeca82753c13039eef6bd293827199b7f0f4f |
|
cygwin-test.yml
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
|
pythonpackage.yml
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0 |
|
test_docs.py
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
|
test_fixture_health.py
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-5f48f43a48797827529858c9434b18833fdbe75afd796c05ae35691d8b9a2f6b |
|
test_repo.py
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87 |
|
test_submodule.py
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
| .github/workflows/alpine-test.yml | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-efd10bfc61f6e81e7ddbeefd3bdeeca82753c13039eef6bd293827199b7f0f4f |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/.github/workflows/alpine-test.yml |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-efd10bfc61f6e81e7ddbeefd3bdeeca82753c13039eef6bd293827199b7f0f4f |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-efd10bfc61f6e81e7ddbeefd3bdeeca82753c13039eef6bd293827199b7f0f4f |
| .github/workflows/cygwin-test.yml | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/.github/workflows/cygwin-test.yml |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5 |
| .github/workflows/pythonpackage.yml | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0 |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/.github/workflows/pythonpackage.yml |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0 |
| test/test_docs.py | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/test/test_docs.py |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723 |
| test/test_fixture_health.py | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-5f48f43a48797827529858c9434b18833fdbe75afd796c05ae35691d8b9a2f6b |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/test/test_fixture_health.py |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
| test/test_repo.py | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87 |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/test/test_repo.py |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87 |
| test/test_submodule.py | https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
|
View file
| https://github.com/EliahKagan/GitPython/blob/4dd89aff2896f63f8d7e61ef3736b1b60e386d16/test/test_submodule.py |
|
Open in desktop
| https://desktop.github.com |
| https://github.co/hiddenchars |
| https://github.com/gitpython-developers/GitPython/pull/2154/{{ revealButtonHref }} |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
|
| https://github.com/gitpython-developers/GitPython/pull/2154/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024 |
| Please reload this page | https://github.com/gitpython-developers/GitPython/pull/2154/files |
|
| https://github.com |
| Terms | https://docs.github.com/site-policy/github-terms/github-terms-of-service |
| Privacy | https://docs.github.com/site-policy/privacy-policies/github-privacy-statement |
| Security | https://github.com/security |
| Status | https://www.githubstatus.com/ |
| Community | https://github.community/ |
| Docs | https://docs.github.com/ |
| Contact | https://support.github.com?tags=dotcom-footer |
Viewport: width=device-width
URLs of crawlers that visited me.