如何在git子模块中"提交"更改?

Dyl*_*tie 237 git git-submodules

在我天真的时候,我已经设置了一个git子模块并将其视为Subversion外部 - 即它现在充满了我刚才意识到的未经提交或推送到任何地方的变化.

是否有一些简单的方法将子模块更改提交/推送回上游存储库?Git推荐的技术是什么,以这种方式在单独的(但链接的)存储库上同时进行开发?

tim*_*dev 381

子模块是它自己的repo/work-area,有自己的.git目录.

因此,首先提交/推送子模块的更改:

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git push
Run Code Online (Sandbox Code Playgroud)

然后告诉您的主项目跟踪更新版本:

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git push
Run Code Online (Sandbox Code Playgroud)

  • @rogerdpack - 你说的没错.子模块通常最终为"无分支".在添加/提交到子模块之前,您经常需要检查一些分支. (16认同)
  • 除了git似乎有时将子模块放入匿名分支... $ git.exe b -a*(没有分支) (9认同)
  • 还有值得注意的是,你可能需要在github超级项目中从文件树创建子模块之后```git checkout master```如果你在``````````````````````````````````````````````````````````````````````` git status```. (7认同)
  • 这为我修复了git push origin HEAD:master (6认同)
  • 尽管这被标记为重复,但+1因为你的答案比另一个更清楚 (5认同)
  • 有没有办法同时进行两个操作? (3认同)
  • 如果您使子模块遵循master分支的尖端,而不是遵循提交的默认分支,那么这种“无分支” /分离头的问题似乎就会消失。[这对我有用](http://stackoverflow.com/questions/9189575/git-submodule-tracking-latest?answertab=active#tab-top)。 (2认同)

Von*_*onC 52

请注意,如果您在各种子模块中提交了一系列更改,您可以(或将很快能够)一次性推送所有内容(即从父仓库中推送一次),其中:

git push --recurse-submodules=on-demand
Run Code Online (Sandbox Code Playgroud)

git1.7.11([ANNOUNCE] Git 1.7.11.rc1)提到:

" git push --recurse-submodules"学会了选择性地查看与超级项目绑定的子模块的历史并推出它们.

可能在此补丁--on-demand选项之后完成:

--recurse-submodules=<check|on-demand|no>::
Run Code Online (Sandbox Code Playgroud)

确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用.

  • 如果check使用,将检查在推送的修订中更改的所有子模块提交在远程上是否可用.
    否则推送将被中止并以非零状态退出.
  • 如果on-demand使用,则将推送要推送的修订中更改的所有子模块.
    如果按需无法推送所有必要的修订,它也将被中止并退出非零状态.

此选项仅适用于一个嵌套级别.不会推送对另一个子模块内部子模块的更改.

  • `git submodule foreach git push -u origin master` (2认同)
  • @rivanov 您使用的是什么版本的 Git? (2认同)

rah*_*n_t 6

$ git submodule status --recursive
Run Code Online (Sandbox Code Playgroud)

在这种情况下也是一个救生员.您可以使用它并gitk --all跟踪您的sha1并验证您的子模块是否指向您认为它们是什么.


nic*_*rim 5

您可以将子模块视为与普通存储库完全相同.要在上游传播您的更改,只需像在通常的目录中一样提交和推送.

  • ...除了我的普通存储库没有分离头. (17认同)
  • 看来这还不是很完整。如果你 `cd submod; git commit -am'新东西'; git push` 将新的提交推送到子mod的原点,但它不会在父项目中记录新的 SHA。官方文档甚至没有提到如何做到这一点。我怀疑它是(在父项目中): `git add submod; git commit -m'更新的子mod'; git 推`。 (3认同)
  • 对我来说,这是最好的答案。如果您像对待任何其他 git repo 一样对待它,则无需记住任何新命令!只需 cd 进入子模块的目录,然后: `git add -A` `git commit -m "some message"` `git push` 然后 cd 到主 repo 并执行相同的操作。 (2认同)