什么是子模块分叉的良好工作stream程

假设我们在github上有下面的仓库结构:

company:project.git \- company:submodule.git 

我公司的一名开发人员推动公司项目,使他的工作空间如下所示:

 developer:project.git \- company:submodule.git 

这对于90%的开发者来说是好的,因为他们不改变子模块库,他们只在项目中工作。 现在假设有一个新function需要改进子模块。 负责此事的开发人员将其工作区转换为:

 developer:project.git \- developer:submodule.git 

到达那里并不是微不足道的,因为他需要用另一个子模块replace一个子模块(git,子模块的原始和叉子是两个不同的东西)。

如果这个开发者在库上工作了一段时间,他将这个结构提交给他的主分支,所以他在github上的分支总是使用分叉的子模块。

一旦他准备好发展,他会创build一个拉请求。 问题在于,合并pull请求时,主存储库看起来像这样:

 company:project.git \- developer:submodule.git 

这是有问题的,因为现在每个跟踪公司分支的开发人员都将以开发人员的子模块结束。

为了解决这个问题,在开发者提出pull请求之前,他的主分支应该移回公司:submodule.git – 这非常尴尬,特别是因为在本地他总是想和developer:submodule一起工作。饭桶。

我们已经尝试了几个工作stream程,上述问题是唯一一个我们没有良好工作stream程的问题。

当开发人员使用特定版本的子模块创build提交时,这是一个强大的声明,即超模块在该确切版本中与子模块一起工作。 如果他的代码确实与公司版本的子模块一起工作,我认为正确的做法是让开发者:

  1. 分支supermodule
  2. 检查子模块中的公司版本
  3. 更新.gitmodules中的.gitmodules ,如果开发人员改变了上游版本
  4. 阶段和承诺的变化
  5. testing一切
  6. 发出拉请求

然后,他可以切换回超模块的正常开发分支。

有一件事我不明白你的问题是:

到达那里并不是微不足道的,因为他需要用另一个子模块replace一个子模块(git,子模块的原始和叉子是两个不同的东西)。

相反,子模块可以是任何git仓库,只要它包含supermodule指向的提交。 如果有两个不同的远程存储库,他可以在子模块中添加一个额外的远程设备。 (开发人员也应该改变.gitmodules ,如果他们要与其他人共享他们的存储库。)


为了回应你的评论,或许值得一提的是如何切换一个子模块指向一个版本。 假设开发人员使用他们自己的超级模块和子模块的存储库,但是这些都是从公司的版本中克隆的(即大多数历史logging是相同的),子模块位于pathlib 。 开发人员现在想要切换子模块来指向公司的版本。 他们可以做到以下几点:

  1. 编辑.gitmodules模块的url参数以指向公司的存储库。
  2. cd lib
  3. git remote add company developer@company:/srv/git/lib.git
  4. git fetch company
  5. git checkout -b upstream-master company/master
  6. cd ..
  7. git add .gitmodules lib
  8. git commit -m "Switch the lib submodule to point back to the company's version"

一旦远程和分支设置完成,步骤3到5就可以改成git checkout <whatever>

另一个简单的解决scheme是告诉git忽略.gitmodules并将其从跟踪中移除。 如上所述,.gitmodules仅用于子模块的初始化,因此在检查子模块时只需要一次。

对于他来说,开发人员不需要更改子模块本身 – 他们可以添加另一个远程并推送它。

例:

 developer:project.git \- company:submodule.git Origins: company/submodule.git developer/submodule.git 

工作stream程:

 cd path/to/submodule git remote add developer git@gitserver/developer/submodule.git 

//破解项目

 cd path/to/submodule git push developer branchname 

这绝对不是完美的,如果在开发者/子模块进入公司/子模块之前,对开发者/项目的拉取请求进入公司/项目,可能会引起问题。

只是我的快速思想。

现在假设有一个新function需要改进子模块。

在子模块中做出的贡献,只有在子模块git回购中的提交才会被请求,像往常一样。

为了推上你的子模块,

  • 项目.gitmodulesconfiguration可以改变你的克隆叉(但保持在你身边)
  • 或者您的子模块分叉可以作为远程添加