如何在无写入权限的GitHub子模块中添加归属主仓库的插件
嘿,这个需求GitHub完全支持,而且有一套成熟的操作流程,我给你一步步拆解清楚:
核心结论
GitHub完全支持你描述的这种场景——把无写入权限的外部仓库作为submodule接入主仓库,既能持续拉取上游更新,又能在submodule指定目录下添加属于主仓库的插件代码。
具体实现步骤
1. 添加外部仓库作为submodule
首先在你的主仓库根目录下,执行以下命令把外部仓库添加为submodule:
git submodule add https://github.com/外部仓库的实际地址.git backends/foo
执行后,外部仓库的代码会被拉取到主仓库的backends/foo目录下,同时主仓库会生成一个.gitmodules文件记录submodule的关联信息。
2. 持续拉取上游submodule的更新
之后要同步上游仓库的最新代码,只需要在主仓库中执行:
# 更新所有submodule到上游最新版本 git submodule update --remote # 或者只更新这个特定的submodule git submodule update --remote backends/foo
更新完成后,主仓库会记录submodule的最新提交哈希,你只需要把这个变更提交到主仓库即可,这样团队成员拉取主仓库后也能同步到最新的submodule版本。
3. 让backends/foo/src/plugin归属于主仓库
这里分两种情况处理:
- 如果上游仓库没有
backends/foo/src/plugin目录:直接在主仓库中创建这个目录,添加你的插件文件,然后执行git add backends/foo/src/plugin/。Git会自动识别这些文件属于主仓库,不会和submodule产生冲突——因为submodule只管理backends/foo目录下原本属于上游仓库的内容,新增的目录会被主仓库接管。 - 如果上游仓库原本存在这个目录:你需要先在本地submodule目录中,把
src/plugin添加到submodule的.gitignore里(因为你没有上游的写入权限,这个修改只在本地生效,不要提交到上游),然后回到主仓库根目录,创建并添加backends/foo/src/plugin下的文件即可,同样这些文件会归属于主仓库。
你可以通过执行git status来验证:backends/foo/src/plugin下的文件会显示为待提交的变更,而submodule本身的状态不会因为这个目录的存在而异常。
关键注意事项
- 当更新submodule时,只要上游仓库没有修改
src/plugin目录(或者上游根本没有这个目录),你的插件文件就不会被覆盖; - 绝对不要在submodule的目录中提交
plugin目录的变更——一来你没有上游的写入权限,二来这些代码属于主仓库,应该提交到主仓库的版本记录中; - 团队成员克隆主仓库时,记得加上
--recurse-submodules参数,或者克隆后执行git submodule init && git submodule update,这样才能同时拉取submodule和主仓库中的插件代码。
内容的提问来源于stack exchange,提问作者edgarstack




