Git Submodule报错:reference is not a tree 问题求助
解决Git子模块
fatal: reference is not a tree 错误 别急,这个问题我碰到过好几次,大概率是父仓库里记录的子模块提交哈希在子模块的远程仓库中已经不存在,或者本地子模块仓库没有同步到对应版本。结合你已经尝试过的操作,给你几个递进的解决办法:
方法一:强制重新初始化并更新子模块
先试试最直接的强制更新命令,它会重新初始化子模块并拉取最新的匹配版本:
git submodule update --init --recursive --force
--init:确保子模块被正确初始化--recursive:如果子模块还有嵌套子模块也会一并处理--force:强制覆盖本地子模块的当前状态
方法二:清理本地子模块缓存后重新拉取
如果方法一无效,我们可以彻底清理本地的子模块文件,再重新同步:
- 删除本地子模块目录:
rm -rf modules/webform
- 从父仓库的Git缓存中移除该子模块的记录:
git rm --cached modules/webform
- 重新初始化并拉取子模块:
git submodule update --init modules/webform
方法三:修正父仓库中的子模块引用
如果上面的方法都没用,说明父仓库记录的那个提交哈希 947a3c67349eb242a8d46d576e544f8129b28cbf 在子模块的远程仓库里确实不存在了(比如被强制推送删除)。这时候需要更新父仓库里的子模块引用:
- 进入子模块目录,拉取所有远程分支的最新内容:
cd modules/webform git fetch --all
- 切换到子模块的主分支(比如
main或master)并拉取最新代码:
git checkout main git pull
- 返回父仓库,将子模块引用更新到当前最新的提交:
cd ../.. git add modules/webform git commit -m "Update webform submodule to latest valid commit"
- 最后再同步一次子模块:
git submodule update --remote modules/webform
如果还是有问题,可以检查下.gitmodules文件里的子模块URL是否正确,确保和远程仓库地址一致(你之前执行的git submodule sync已经做过这一步,但可以再确认)。
内容的提问来源于stack exchange,提问作者Armando Silva
相关产品推荐
相关产品推荐

