Git子模块修改提交:会推送到上游仓库还是仅本地仓库?
Git子模块相关问题解答
1. 提交子模块修改并push会改动上游仓库吗?
不会直接改动上游仓库。Git子模块的核心是在主仓库my-repo中记录子模块的特定提交哈希:
- 你在
submod目录内提交的修改,只会保存在本地的子模块仓库副本里; - 若直接执行
push,Git会尝试推送到submod当前配置的远程仓库(即原上游),但因为你没有上游权限,这个推送操作会失败; - 主仓库
my-repo只会更新对submod提交哈希的引用,不会自动把submod的修改同步到上游。
2. 如何维护子模块的自有副本?
因为没有上游仓库权限,子模块并非最优方案,更合适的处理方式如下:
方案一:Fork上游仓库后维护子模块
- 先在代码托管平台fork原上游的
submod仓库,得到属于你自己的远程仓库; - 在
my-repo中修改submod的远程仓库地址,指向你的fork仓库:cd my-repo/submod git remote set-url origin <你的fork仓库地址> - 后续
submod内的修改,可直接提交并推送到自己的fork仓库,主仓库my-repo记录的是你fork仓库的提交哈希,完全由你自主维护这个副本。
方案二:用Git subtree替代子模块
如果希望把submod内容完全整合到my-repo内部,无需独立仓库,可改用Git subtree:
- 将
submod的内容合并到my-repo的指定目录,作为主仓库的一部分管理,所有修改直接提交到my-repo; - 关键命令示例:
# 把上游submod仓库合并到my-repo的submod目录 git subtree add --prefix submod <上游submod仓库地址> main # 后续若需同步上游更新 git subtree pull --prefix submod <上游submod仓库地址> main
内容的提问来源于stack exchange,提问作者unsafe_where_true
相关产品推荐
相关产品推荐

