在Git子模块内部嵌套添加子模块出现路径报错该如何解决?
问题原因
你收到的报错
fatal: Pathspec '.oh-my-zsh/custom/plugins/zsh-vi-mode' is in submodule '.oh-my-zsh'
核心原因是:.oh-my-zsh已经是根.dotfile仓库的独立子模块,根仓库默认没有权限直接在子模块的内部路径下创建新的嵌套子模块。
解决方案
推荐优先使用无需修改Oh My Zsh官方子模块的方案,避免维护fork版本的额外成本:
方案1:自定义ZSH_CUSTOM路径(推荐)
不用往.oh-my-zsh目录下写入任何自定义内容,所有自定义插件/主题都放在根dotfile仓库的独立路径下:
- 首先在根仓库下创建自定义插件存放目录,执行命令:
mkdir -p custom/plugins - 在根仓库下直接添加插件作为子模块:
git submodule add git@github.com:jeffreytse/zsh-vi-mode.git custom/plugins/zsh-vi-mode - 打开你的
.zshrc配置文件,在加载oh-my-zsh.sh之前添加如下配置,指定自定义文件的加载路径:export ZSH_CUSTOM="$HOME/.dotfiles/custom" - 后续照常把
zsh-vi-mode添加到.zshrc的plugins数组中即可,Oh My Zsh会自动从你指定的自定义路径加载插件。
方案2:添加嵌套子模块(适合自行维护Oh My Zsh fork版本的场景)
如果你确实需要把插件嵌套到.oh-my-zsh的目录结构中,需要先进入子模块目录操作:
- 第一步进入Oh My Zsh子模块目录:
cd .oh-my-zsh - 在子模块内部添加插件子模块:
git submodule add git@github.com:jeffreytse/zsh-vi-mode.git custom/plugins/zsh-vi-mode - 提交Oh My Zsh子模块的变更(注意:该操作需要你将.oh-my-zsh指向你自己fork的Oh My Zsh仓库,否则无法推送变更到上游官方仓库):
git add .gitmodules custom/plugins/zsh-vi-mode git commit -m "feat: add zsh-vi-mode submodule" git push
- 回到根dotfile仓库,提交Oh My Zsh子模块的版本变更:
cd .. git add .oh-my-zsh git commit -m "update oh-my-zsh submodule version"
内容的提问来源于stack exchange,提问作者Mike Pham
相关产品推荐
相关产品推荐

