Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何基于超级项目分支切换子模块分支_Git_Git Submodules_Git Subtree - Fatal编程技术网

Git 如何基于超级项目分支切换子模块分支

Git 如何基于超级项目分支切换子模块分支,git,git-submodules,git-subtree,Git,Git Submodules,Git Subtree,我一直在研究Git子模块以创建一个“Git项目中的Git项目”,但我遇到了一个问题,它告诉我子模块可能不是正确的解决方案 让我解释一下我想做什么: 目前,我有一个具有多个分支(master和development)的单个项目和一个库,我想将其分离到它自己的Git项目中(这样它就可以独立开发,并具有自己的提交历史)。具体而言,我还希望能够: 在库项目的单独克隆中提交和推送更改,这些更改在明确请求之前不会在超级项目中更新 在超级项目主分支上使用库主分支 在超级项目开发分支上使用库开发分支 能够做到以

我一直在研究Git子模块以创建一个“Git项目中的Git项目”,但我遇到了一个问题,它告诉我子模块可能不是正确的解决方案

让我解释一下我想做什么:

目前,我有一个具有多个分支(master和development)的单个项目和一个库,我想将其分离到它自己的Git项目中(这样它就可以独立开发,并具有自己的提交历史)。具体而言,我还希望能够:

  • 在库项目的单独克隆中提交和推送更改,这些更改在明确请求之前不会在超级项目中更新
  • 在超级项目主分支上使用库主分支
  • 在超级项目开发分支上使用库开发分支
  • 能够做到以下几点也很好(但不是必需的):

  • 从超级项目中提交并推送对库项目的更改
  • 据我所知,Git子模块支持#1和#4(尽管#4需要一些额外的检查以确保正确的分支)#2和#3没有那么多


    我已经看过了和,但它们似乎都没有提供我所要求的功能——可以用Git实现吗?不需要大量额外的移动/重命名/签出目录是否可行?

    您的要求1-3可以通过子模块实现。需求4可以通过子树实现,但只能通过子模块以有限的方式实现

    首先,请注意,在不同的项目/回购协议之间进行多次互动必然需要多次干预,以保持项目同步。(所谓交互,我的意思是对子模块的微小更改需要对子项目进行更改。)

    有两件事需要注意:

    • 子模块的当前提交存储在超级项目的每个提交中
    • 子模块仅存储提交id,而不存储特定分支

    具体来说,每次您想要更新子模块时,您必须

  • 在子模块中手动签出最新版本
  • 在超级项目中提交新的子模块
  • 如果很少更新子模块(但不确定子树),则子模块最有意义。至少,这是我的印象。 我经常使用子模块作为某种类型来确保代码是可复制的(实际上,这就是版本控制的目的)。 也就是说,为了编码信息,比如“对于提交X,我们需要提交子模块A的Y”

    两个项目之间有一个稳定的接口是限制交互的关键

    当您在超级项目中切换分支时,git子模块将知道它必须在该分支的特定子模块的提交中。 然而

  • git不会自动检查提交-您必须手动运行
    git子模块更新
  • git不会自动提取子模块原点的更改
  • 因此,是的,子模块提供了需求1-3,尽管需要一些手工工作

  • 子模块只是一个克隆。因此,您可以独立处理子模块的原点,而无需引入更改
  • 每个超级项目的提交都单独保存子模块的提交。因此,对于不同的分支,您有不同的子模块提交。ut请记住运行
    git子模块更新
  • 见第2条
  • 只能在子模块目录中执行。因此
    cd子模块;git提交;git推送
    有效
    您遇到了哪些问题?此建议可能不适用于您的案例,但一般来说,如果模块需要位于开发分支上,而依赖模块也位于开发分支上,我通常会选择将两个模块放在同一个存储库中。如果该模块是外部服务的客户端库,而您正在准备开发分支使用新版本,该怎么办?我敢打赌这是一个非常常见的用例。我不确定这是否解决了以下问题:1。子模块位于开发分支中。2.超级项目开发分部现已并入主分部。3.git子模块更新在superproject中运行。4.超级项目现在有了子模块的开发分支(我希望它仍然是主分支)。还是我误解了你的解释?“每次你想更新你的子模块,你必须1.手动检查子模块中的最新版本”。我还添加了一个解释,即子模块的提交存储在每个超级项目提交中。因此,在合并之后(或合并期间),您必须手动签出子模块的主分支。