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

时间:2011-08-24 10:59:18

标签: git github git-submodules

假设我们在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

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

4 个答案:

答案 0 :(得分:5)

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

  1. 分支超级模块
  2. 签出子模块中的公司版本
  3. 如果开发人员从上游版本更改了该模块,则
  4. 在超级模块中更新.gitmodules
  5. 阶段并提交更改
  6. 测试一切
  7. 发出拉取请求
  8. 然后他可以切换回超模块中的正常开发分支。

    我不明白你的问题有以下几点:

      

    由于他需要用另一个子模块替换子模块,所以要实现这一点并不简单(对于git,子模块的原始和分支是两个不同的东西)。

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


    在回复下面的评论时,或许有必要了解如何将子模块从指向一个版本切换到另一个版本。假设开发人员使用自己的存储库来存储超级和子模块,但这些存储库都是从公司的版本中克隆出来的(即大部分历史都是相同的),子模块位于路径lib。开发人员现在想要切换子模块以指向公司的版本。他们可以做到以下几点:

    1. 编辑url中子模块的.gitmodules参数,指向公司的存储库。
    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"
    9. 一旦设置了远程和分支,步骤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中的提交。

为了推动你的子模块叉,

  • 项目.gitmodules配置可以在您的克隆分支中更改(但保留在您的一边)
  • 或您的子模块叉可以添加为远程