提交对子模块的更改,而不必提交父repo

时间:2012-02-06 21:01:09

标签: git git-submodules

假设我有一个父回购myproject,还有一个名为submodule的独立回购,其目录结构如下:


    root$ find . -not -path *.git*
    .
    ./myproject
    ./myproject/submodule

现在我将submodule添加为myproject的子模块。


    root$ cd myproject
    myproject$ git submodule add git://url-to-submodule:submodule.git submodule
    Adding existing repo at 'submodule' to the index

现在,假设我将某些内容更改为submodule


    myproject$ cd submodule
    submodule$ touch herpin.txt
    submodule$ add herpin.txt
    submodule$ git commit -am "i'm herpin and i'm derpin"

此时,我将返回父存储库,并检查git状态:


    submodule$ cd ..
    myproject$ git status
    # On branch master
    # Changes not staged for commit:
    #   (use "git add ..." to update what will be committed)
    #   (use "git checkout -- ..." to discard changes in working directory)
    #
    #   modified:   submodule (new commits)
    #
    no changes added to commit (use "git add" and/or "git commit -a")

好吧,该死的 - 现在每次我在子模块中提交一些内容时,我也必须提交父级。

如果您有一个更复杂的子模块树,它会很快变得烦人。让我们说 - 深度为4级。如果我在最内层的子模块上做出改变,我必须提交它的父母,祖父母,曾祖父母,以及伟大的父母。这是一个令人痛苦的痛苦---。

一定有更好的方法! (不,不嵌套这么多级别不是一个选项。:/那不是我的调用...)是不是有一种方法git-commit可以通知父存储库的提交?

3 个答案:

答案 0 :(得分:1)

你当然可以为此编写自己的脚本。提交后挂钩将是一个好地方。但我不确定这是否是你想要的,因为我认为这个想法不是复制包含存储库中的每个提交,而是要有不同的抽象层。即将一系列对子模块的提交分组到超级存储库的一个提交中,然后以不太详细的方式描述更改(子模块:已实现的特性x)。

答案 1 :(得分:0)

提交子模块应该被视为提交到另一个外部库/存储库。

不要在root上使用git status,在子模块上使用它。

不,您不需要在容器中提交更改,您只需要在子模块中提交它们。

然后,您可以进行多项更改,回滚,将子模块保留在稳定的分支上等,然后仅将父容器更新为子模块的稳定版本。

更新子模块引用不应该经常进行,并且应该只在兼容版本之间进行,否则你将在一行中进行大量的'bump'提交,只是在你发现时更新子模块。

简而言之,在子模块中进行工作,提交,在子模块提交中做更多工作。完成后,通过提交容器将子模块引用更新为新版本,或者将子模块回滚到最后一个稳定版本,留下提交以供将来开发。

答案 2 :(得分:0)

对子模块进行更改时,可以将未提交的更改推送到远程存储库,而无需触摸父项目,如下所示:

  • 从根项目将目录更改为子模块。 cd submodule
  • 隐藏对子模块所做的未提交的更改。 git stash
  • 拉出您要应用更改的分支。 git pull <remotename> <branchname>
  • 检出分支。 git checkout <branchname>
  • 弹出隐藏处。 git stash pop
  • 像往常一样提交未提交的更改。 git add git commit
  • 将提交的更改推送到远程存储库。 git push <remotename> <branchname>

现在,您已经在本地子模块中提交了更改,并将其推送到了远程存储库。在主项目.gitmodules中应进行更新,并指向您在子模块目录中所做的最后一次提交。现在,您可以选择提交.gitmodules文件以使用带有已更新子模块的提交,或者可以放弃并继续使用旧的而不是未更新的子模块。但是,如果您丢弃并运行git submodule update --remote,它将拉动未更新的旧分支,因此您可能还希望在主项目中提交此.gitmodules文件。

这是Pro Git书中的一章:https://git-scm.com/book/en/v2/Git-Tools-Submodules