假设我们在github上有以下存储库结构:
company:project.git
\- company:submodule.git
我公司的开发人员分配公司项目,使他的工作区看起来像这样:
developer:project.git
\- company:submodule.git
对于90%的开发人员来说这很好,因为他们不更改子模块库,他们只在项目中工作。现在假设有一个新功能需要改进子模块。负责这项工作的开发人员将他的工作空间转换为:
developer:project.git
\- developer:submodule.git
由于他需要用另一个子模块替换子模块,所以要实现这一点并不简单(对于git,子模块的原始和分支是两个不同的东西)。
如果这个开发人员在库上工作了一段时间,他会将这个结构提交给他的主分支,所以他在github上的fork总是使用forked子模块。
一旦他准备好开发,他就会创建一个拉取请求。问题是当合并拉取请求时,主存储库将如下所示:
company:project.git
\- developer:submodule.git
这是有问题的,因为现在每个跟踪公司分支的开发人员都会得到开发人员的子模块。
要解决这个问题,在开发人员发出拉取请求之前,应该将他的主分支移回公司:submodule.git - 这非常尴尬,特别是因为本地他总是想要与开发人员合作:submodule.git
我们已经尝试过多个工作流程,上述问题是我们唯一没有良好工作流程的问题。
答案 0 :(得分:5)
当开发人员使用特定版本的子模块创建提交时,这是一个强大的声明,表明超级模块与该确切版本的子模块一起工作。如果他的代码确实与公司的子模块版本一起使用,我认为正确的做法是让开发人员:
.gitmodules
然后他可以切换回超模块中的正常开发分支。
我不明白你的问题有以下几点:
由于他需要用另一个子模块替换子模块,所以要实现这一点并不简单(对于git,子模块的原始和分支是两个不同的东西)。
相反,子模块可以是任何git存储库,只要它包含超模块指向的提交即可。如果有两个不同的远程存储库,他只需在子模块中添加一个额外的远程存储库。 (如果开发人员要与其他任何人共享他们的存储库,开发人员也应该更改.gitmodules
。)
在回复下面的评论时,或许有必要了解如何将子模块从指向一个版本切换到另一个版本。假设开发人员使用自己的存储库来存储超级和子模块,但这些存储库都是从公司的版本中克隆出来的(即大部分历史都是相同的),子模块位于路径lib
。开发人员现在想要切换子模块以指向公司的版本。他们可以做到以下几点:
url
中子模块的.gitmodules
参数,指向公司的存储库。cd lib
git remote add company developer@company:/srv/git/lib.git
git fetch company
git checkout -b upstream-master company/master
cd ..
git add .gitmodules lib
git commit -m "Switch the lib submodule to point back to the company's version"
一旦设置了远程和分支,步骤3到5就可以更改为git checkout <whatever>
。
答案 1 :(得分:3)
另一个简单的解决方案是告诉git忽略.gitmodules并将其从跟踪中删除。如上所述,.gitmodules仅用于初始化子模块,因此在检查子模块时只需要一次。
答案 2 :(得分:2)
对于他开发它,开发人员不需要更改子模块本身 - 他们可以添加另一个遥控器并推送它。
示例:
developer:project.git
\- company:submodule.git
Origins: company/submodule.git
developer/submodule.git
工作流:
cd path/to/submodule
git remote add developer git@gitserver/developer/submodule.git
//攻击项目
cd path/to/submodule
git push developer branchname
这绝对不是完美的,如果开发人员/项目的拉取请求在开发人员/子模块进入公司/子模块之前进入公司/项目,则可能会导致问题。
只是我的快速思考。
答案 3 :(得分:0)
现在假设有一个新功能需要改进子模块。
在子模块中做出贡献,只需像往常一样拉取子模块git repo中的提交。
为了推动你的子模块叉,