如何将已作为子模块的仓库内部的Git仓库添加为上层仓库的子模块
问题原因
你的两个报错有明确的根因:
- 第一个忽略提示是因为oh-my-zsh仓库自带的
.gitignore规则默认排除了custom目录下的第三方插件/主题文件 - 第二个fatal报错是Git子模块的原生限制:Git不允许父仓库的子模块路径落在另一个已关联的子模块的目录范围内,你已经把
~/.oh-my-zsh作为dotfiles仓库的子模块,它的整个目录的管理权都属于oh-my-zsh子模块自身,父仓库无法再在这个路径下新增任何子模块。
可用解决方案(均满足clone即可用、无额外配置要求)
方案1:将自定义插件/主题作为oh-my-zsh子模块的嵌套子模块
这个方案不需要调整现有目录结构,完全复用你现在的路径:
- 进入oh-my-zsh子模块目录:
cd ~/.oh-my-zsh
- 在oh-my-zsh仓库内添加自定义插件、主题为它的子模块,以powerlevel10k为例:
git submodule add <插件对应的远程仓库地址> custom/themes/powerlevel10k
你不需要担心oh-my-zsh的.gitignore影响,子模块的跟踪逻辑优先级高于.gitignore规则,不会被忽略。
3. 回到家目录,提交oh-my-zsh子模块的变更到你的dotfiles仓库:
config add ~/.oh-my-zsh config commit -m "feat: add powerlevel10k as nested submodule of oh-my-zsh"
后续新设备部署时,只要执行带递归参数的clone命令即可一次性拉取所有子模块:
git clone --recurse-submodules <你的dotfiles仓库地址> ~/repositories/dotfiles
不需要任何额外配置即可直接使用。
方案2:使用oh-my-zsh原生支持的自定义目录参数避开路径冲突
如果你不想修改oh-my-zsh子模块的内容,避免后续oh-my-zsh版本更新产生冲突,可以用oh-my-zsh官方支持的ZSH_CUSTOM环境变量指定自定义配置目录,完全避开~/.oh-my-zsh路径:
- 把现有custom目录移动到非oh-my-zsh路径下:
mv ~/.oh-my-zsh/custom ~/.zsh-custom
- 编辑你的
.zshrc文件,在source $ZSH/oh-my-zsh.sh行之前添加如下配置,指定自定义目录路径:
export ZSH_CUSTOM="$HOME/.zsh-custom"
- 现在你就可以正常把
.zsh-custom下的插件、主题作为dotfiles仓库的子模块添加,不会触发路径冲突报错:
config submodule add <主题对应的远程仓库地址> ~/.zsh-custom/themes/powerlevel10k
- 提交
.zshrc和新增子模块的变更到dotfiles仓库即可。
这个方案同样支持递归clone直接使用,完全不影响oh-my-zsh自身的版本更新。
内容的提问来源于stack exchange,提问作者FalcoGer
相关产品推荐
相关产品推荐

