-
-
Notifications
You must be signed in to change notification settings - Fork 933
submodule.update with init=True does not work if the submodule does not have a 'master' branch #1058
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Thanks for taking the time for this fantastic issue description! Unfortunately, nothing I could write here would do it any justice because I wouldn't know how to fix that. |
Thanks for the helpful write-up, this saved me a lot of troubleshooting time. It seems the cleanest approach (at least in my situation) was to specify the branch in the |
A workaround that worked for me was the following:
Explanation: |
* Removed gitpython - gitpython-developers/GitPython#1058 is a blocker * Now calling git directly
Ran into a similar issue, an even shorter workaround is for submodule in repo.submodules:
submodule.update(init=True, force=True) The warning will still print, but thanks to the Alternatively, you can add the branch explicitly to your .gitmodules file first:
and the warning won't appear at all. |
Here's a hack I used for my text editor thing # s = git.Submodule() instance
new = Submodule(
s.repo,
s.binsha,
s.mode,
s.path,
s.name,
s.parent_commit,
s.url,
# hack to get gitpython working with our setup
# i.e default is `master` (unless something specified in .gitmodules) and GitHub uses `main`
"refs/heads/main",
)
new.submodule_repo.update(init=True, force=True) |
We have encountered an issue with
submodule.update
that reproduces in a rather special circumstance:Setup
Have a git repo, say
test
, containing one submodule, saytest_submodule
.test_submodule
must have nomaster
branch (let say the default branch is calleddevelop
instead).Check out a revision of
test
that points to the tip ofdevelop
fortest_submodule
, but do notgit submodule init
the submodule. The directory hierarchy should look like this:Now, create a
Repo
fortest
, and callrepo.submodules[0].update(init=True)
Expected results
The tip of
develop
is checked out intest_submodule
and the index is clean.Actual results
test_submodule
is pointing at the tip of develop, but all of the files are staged for deletion. Additionally, there is a warning printed:Failed to checkout tracking branch refs/heads/master
My analysis of why this happens
Before any bad behavior happens,
submodule.update
clones the submodule repository with-n
, which means the clone does not actually check out the commit the clone ends up with. Remember this for later.After cloning, we begin the process of updating the submodule to match what the parent repo specifies.
submodule.update
takes an optionalbranch
argument, which defaults toNone
. Whenbranch
isNone
, we assume the branch ismaster
. Here, we try to find this branch and point HEAD to it, but of course in the repro case this fails because the branch does not exist. This is crucial, because this means we skip the line that marks the repo as "not checked out" by pointing the branch to the "NULL" sha.Now, recall that a requirement of the repro is that
test
points to the tip ofdevelop
fortest_submodule
. Since we did not move the repo to the NULL sha beforehand, the repo is already at the desired sha when we arrive at this conditional. Therefore, the condition evaluates to false, and we skip all the code that actually checks out code.Finally, recall our
-n
checkout from the first paragraph. Since we did not check out any code after cloning, the repo is left in an un-checked-out state, which is exactly the "Actual results" state described above.Closing thoughts
We can workaround this issue simply by adding a dummy
master
branch totest_submodule
, but this should not be required. Ideally,submodule.update
does not require a valid branch to operate correctly, sincegit submodule update --init
works just fine without one.The text was updated successfully, but these errors were encountered: