使用Git Submodules向分包商开放仓库部分代码是否可行?
Git Submodules 是否适用于此场景及工作流
结论:这确实是Git Submodules的适用场景。通过子模块,你可以把非敏感代码拆成独立的Git仓库,同时在主仓库里保留对该子模块的引用——分包商只需要拥有这个子模块仓库的访问权限,完全接触不到主仓库里的专有代码,也无需把项目拆成依赖项。
具体工作流
1. 把非敏感代码拆成独立仓库
- 先处理本地主仓库:找到非敏感代码所在的文件夹(比如叫
public-code),用git subtree拆分出它的完整提交历史:git subtree split --prefix=public-code -b public-branch - 在你的Git服务器上创建一个新的空远程仓库(命名为
public-repo),把拆分出的分支推上去:git push git@your-git-server:public-repo.git public-branch:main - 回到主仓库,删掉原来的
public-code文件夹并提交变更:git rm -r public-code git commit -m "移除原public-code文件夹,后续以子模块形式引入"
2. 在主仓库中添加子模块
- 执行命令将
public-repo作为子模块添加到主仓库的public-code路径下:
这会自动生成git submodule add git@your-git-server:public-repo.git public-code.gitmodules文件,记录子模块的仓库地址和对应路径。 - 提交子模块的添加操作:
git add .gitmodules public-code git commit -m "添加public-code作为子模块" git push
3. 分包商的开发流程
- 分包商只需要克隆这个独立的
public-repo仓库,不需要接触主仓库:git clone git@your-git-server:public-repo.git - 他们正常开发、提交、推送代码即可,和普通Git仓库操作完全一样:
git add . git commit -m "优化XX功能" git push origin main
4. 主仓库同步子模块的更新
- 当分包商推送了新代码,你可以在主仓库里同步最新版本:
cd public-code git pull origin main cd .. git add public-code git commit -m "同步子模块的最新代码" git push
5. 日常维护注意事项
- 主仓库的
.gitmodules文件要妥善保管,不要随意删除或修改,它是子模块的配置核心 - 如果需要修改子模块的远程仓库地址,先编辑
.gitmodules文件,再执行git submodule sync生效 - 其他人克隆你的主仓库时,需要加上
--recurse-submodules参数才能同时拉取子模块代码:
或者克隆后手动初始化子模块:git clone --recurse-submodules git@your-git-server:main-repo.gitgit submodule init git submodule update
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

