Destructive operation on submodules with `submodule.recurse = true` git setting
See original GitHub issuedescribe your issue
I added pre-commit to an ansible playbook repository that does extensive usage of git submodules for roles.
I had two submodules with extensive changes:
$ gst
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
...
modified: roles/dnscrypt-proxy (modified content) <-- submodule with extensive (non-commited) changes
modified: roles/syncthing (modified content) <-- another submodule with extensive (non-commited) changes
...
Upon doing a commit I received an error (check ~/.cache/pre-commit/pre-commit.log section) due to having some problems in my repo and its submodules.
Notice that I cold not even run git status
afterwards:
$ gst
fatal: not a git repository: roles/matomo/../../.git/modules/roles/matomo
After fixing the problems:
$ rm -rf roles/matomo/ .git/modules/roles/matomo/
$ git submodule update
Cloning into '/home/apoc/w/posg-ops/roles/matomo'...
Submodule path 'roles/matomo': checked out '######'
fatal: could not get a repository handle for submodule 'roles/php'
$ rm -rf roles/php/ .git/modules/roles/php
$ git submodule update
Cloning into '/home/apoc/w/posg-ops/roles/php'...
Submodule path 'roles/php': checked out '######'
and running git apply
to have my changes back:
$ git apply /home/a666/.cache/pre-commit/patch1632709290-1076629
I noticed that my two submodules now had no changes in them… And unfortunately I see nothing in pre-commit cache area to help me recover them.
pre-commit --version
pre-commit 2.15.0
.pre-commit-config.yaml
---
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.0.1
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-toml
- id: check-added-large-files
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.3.54
hooks:
- id: editorconfig-checker
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.51.0
hooks:
- id: terraform_validate
- id: terraform_fmt
- id: checkov
- id: terrascan
- id: terraform_tfsec
~/.cache/pre-commit/pre-commit.log (if present)
version information
pre-commit version: 2.15.0
sys.version:
3.9.7 (default, Aug 31 2021, 13:28:12)
[GCC 11.1.0]
sys.executable: /home/a666/.local/pipx/venvs/pre-commit/bin/python
os.name: posix
sys.platform: linux
error information
An unexpected error has occurred: CalledProcessError: command: ('/usr/lib/git-core/git', 'checkout', '--', '.')
return code: 255
expected return code: 0
stdout: (none)
stderr:
Migrating git directory of 'roles/fail2ban' from
'/home/a666/ops/roles/fail2ban/.git' to
'/home/a666/ops/.git/modules/roles/fail2ban'
fatal: not a git repository: ../../.git/modules/roles/matomo
error: Submodule 'roles/matomo' could not be updated.
Migrating git directory of 'roles/openproject' from
'/home/a666/ops/roles/openproject/.git' to
'/home/a666/ops/.git/modules/roles/openproject'
Migrating git directory of 'roles/oryhydra' from
'/home/a666/ops/roles/oryhydra/.git' to
'/home/a666/ops/.git/modules/roles/oryhydra'
fatal: not a git repository: ../../.git/modules/roles/php
error: Submodule 'roles/php' could not be updated.
Traceback (most recent call last):
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/error_handler.py", line 65, in error_handler
yield
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/main.py", line 368, in main
return hook_impl(
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/commands/hook_impl.py", line 237, in hook_impl
return retv | run(config, store, ns)
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/commands/run.py", line 399, in run
exit_stack.enter_context(staged_files_only(store.directory))
File "/usr/lib/python3.9/contextlib.py", line 448, in enter_context
result = _cm_type.__enter__(cm)
File "/usr/lib/python3.9/contextlib.py", line 119, in __enter__
return next(self.gen)
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/staged_files_only.py", line 92, in staged_files_only
with _intent_to_add_cleared(), _unstaged_changes_cleared(patch_dir):
File "/usr/lib/python3.9/contextlib.py", line 119, in __enter__
return next(self.gen)
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/staged_files_only.py", line 61, in _unstaged_changes_cleared
cmd_output_b('git', 'checkout', '--', '.', env=no_checkout_env)
File "/home/a666/.local/pipx/venvs/pre-commit/lib/python3.9/site-packages/pre_commit/util.py", line 154, in cmd_output_b
raise CalledProcessError(returncode, cmd, retcode, stdout_b, stderr_b)
pre_commit.util.CalledProcessError: command: ('/usr/lib/git-core/git', 'checkout', '--', '.')
return code: 255
expected return code: 0
stdout: (none)
stderr:
Migrating git directory of 'roles/fail2ban' from
'/home/a666/ops/roles/fail2ban/.git' to
'/home/a666/ops/.git/modules/roles/fail2ban'
fatal: not a git repository: ../../.git/modules/roles/matomo
error: Submodule 'roles/matomo' could not be updated.
Migrating git directory of 'roles/openproject' from
'/home/a666/ops/roles/openproject/.git' to
'/home/a666/ops/.git/modules/roles/openproject'
Migrating git directory of 'roles/oryhydra' from
'/home/a666/ops/roles/oryhydra/.git' to
'/home/a666/ops/.git/modules/roles/oryhydra'
fatal: not a git repository: ../../.git/modules/roles/php
error: Submodule 'roles/php' could not be updated.
Issue Analytics
- State:
- Created 2 years ago
- Comments:10 (6 by maintainers)
Top Results From Across the Web
What are the drawbacks to setting git's submodule.recurse ...
Them main drawback is the possible time overhead introduced by having to go recursively in each submodule (and their own respective submodules).
Read more >Git - Submodules - Git SCM
There is another way to do this which is a little simpler, however. If you pass --recurse-submodules to the git clone command, it...
Read more >API Reference — GitPython 3.1.29 documentation
Current GitPython version. ... recursive – if True, we will operate recursively and update child- ... This works if the submodules ID does...
Read more >GitPython Documentation - Read the Docs
As our GitPython repository has submodules already that point to GitHub, ... recursive – if True, we will operate recursively and update ...
Read more >git(1) - FreeBSD Manual Pages
The <name> is expected in the same format as listed by git config ... git-submodule(1) Initialize, update or inspect submodules. git-switch(1) Switch ...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Well, submodules were always like a weird git workaround to a difficult problem (I think) and not very though out…
submodule.recurse = 1
makesgit checkout -- .
also rungit checkout -- .
in each submodule – seems like a really badgit
feature