假设我有一个父回购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可以通知父存储库的提交?
答案 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