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

时间:2011-04-04 18:51:54

标签: git git-submodules

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

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

5 个答案:

答案 0 :(得分:352)

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

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

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git push

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

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git push

答案 1 :(得分:51)

请注意,如果您在各种子模块中提交了大量更改,则可以(或将很快能够)一次性推送所有内容(即一个推送来自父回购),用:

git push --recurse-submodules=on-demand

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

  

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

可能在this patch --on-demand 选项后​​完成:

--recurse-submodules=<check|on-demand|no>::
  

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

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

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

答案 2 :(得分:7)

$ git submodule status --recursive

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

答案 3 :(得分:5)

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

答案 4 :(得分:2)

在提交和推送之前,您需要为子模块初始化一个工作存储库树。 我正在使用乌龟并做以下事情:

首先检查是否存在.git文件(不是目录)

  • 如果有这样的文件,它包含supermodule git目录的路径
  • 删除此文件
  • 做git init
  • 执行git添加用于子模块的远程路径
  • 按照以下说明

如果有.git文件,那么可靠的是.git目录跟踪本地树。 你仍然需要一个分支(你可以创建一个)或切换到master(有时不起作用)。 最好的办法是   - git fetch   - git pull。不要省略提取。

现在,您的提交和提取将与您的origin / master

同步