Git子模块 - 无法获取子模块的存储库句柄

5

Git子模块支持似乎非常有问题。我尝试在工作树中切换分支,现在一直出现这个错误:

fatal: could not get a repository handle for submodule 'the_submodule'

这到底是什么意思?什么是存储库句柄?


真正的问题是“Q:什么是git的'submodule'?”答案是:“这是相对较新的东西,并不一定被所有Git供应商(例如Gitlab、GitHub / Azure DevOps等)和所有Git命令(例如“git worktree”,根据John de Largentaye的回复下面)完全支持。”请在此处查看更多详细信息:https://git-scm.com/book/en/v2/Git-Tools-Submodules - paulsm4
我不会称它们为“新”,但是它们似乎非常容易出现错误且支持很差。像切换分支这样的简单操作也可能导致你的代码库处于极其糟糕的状态。 - Timmmm
2个回答

12
我解决这个问题的方法是手动清理并重新初始化我的有问题的子模块:
``` git submodule deinit the_submodule git submodule init the_submodule git submodule update the_submodule ```
请注意,目前(2023年初),不幸的是,`git worktree` 与子模块不兼容。`git-worktree` 的 man 页面在 BUGS 下列出:
``` 多重检出总体上仍然处于实验阶段,并且对子模块的支持是不完整的。不建议对超级项目进行多重检出。 ```
(强调是我的)
编辑:您还可以通过禁用 `submodule.recurse` 选项(默认关闭)来继续进行 git 操作,即通过 `git config` 或使用 `git -c submodule.recurse=no subcommand ...` 来进行单个命令。

是的,这也是我必须要做的。我还需要删除一些 git 配置文件,详见此处 - Timmmm

0
我曾经遇到过一个类似的问题,并且需要@Timmmm提供的Lore Kernel Link的澄清,关于这个问题我需要两次。至于“它的意思是什么”,似乎意味着你的本地仓库对于一个子模块有一个传统的名称引用,还有一个新的名称引用,当它们不一致时会引起冲突。
至于“什么是仓库句柄”,我认为它只是模块的根目录/.git/modules/中的仓库位置名称,并且即使该子模块已被取消初始化以进行更改,它仍在仓库中使用。来自Lore Kernel Link的排序似乎表明这是由git处理子模块的方式引起的,而防止这种用户体验的前进路径尚未确定。
对于偶然遇到这个问题并寻求解决方法的任何人,链接中建议删除 .git/module/ 的方法对我和帖子的作者都有效。非常感谢 @Timmmm,因为我已经花了大约6个月的时间,才刚刚找到这个解决方案。与只使用不带递归的命令的建议不同,我无法在没有额外步骤的情况下达到良好的状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接