我在项目里加了个子模块,拉取了最新提交,但本地代码好像没更新,还是旧的。明明在子模块目录里执行了 git pull,也看到有新commit,可主项目引用的组件还是老样子。
比如我主项目里这样引用子模块里的组件:
<script type="module">
import { Button } from './submodules/ui-lib/components/button.js';
// 使用Button...
</script>
是不是光pull子模块不够?还需要在主仓库里再提交一次子模块的指针变更?有点懵……
问题在于你对子模块的理解有点偏差。子模块在主项目里本质上就是一个"指针",它记录的是子模块仓库的某个特定commit SHA,而不是"最新版本"。你在子模块目录里pull确实把子模块本身更新了,但主项目里的那个指针还指着旧commit呢。
来解决这个问题,有两种常见方式:
方式一:手动在主项目里更新指针
第一步,进入子模块目录,切换到主分支并拉取最新
cd submodules/ui-libgit checkout main
git pull
第二步,回到主项目,会看到子模块有变更
cd ../..git status
你会看到类似
new commit的提示,说明子模块的指针变了第三步,提交这个变更
git add submodules/ui-libgit commit -m "更新子模块到最新版本"
这样主项目就指向新的commit了。
方式二:用命令一步到位(推荐)
如果你想直接让子模块更新到最新,然后用一条命令搞定:
git submodule update --remote submodules/ui-lib然后同样需要在主项目里add和commit这个变更。
原理说白了就是:主项目依赖的不是"子模块最新",而是"子模块的某个具体版本"。子模块本身更新了,但你没告诉主项目要用新版本,主项目就继续用旧的。
所以你猜对了,就是需要在主仓库里再提交一次子模块指针的变更。子模块的pull只是更新了子模块本身,主项目的引用不会自动跟着变。