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

我在天真的时候,设置了一个git子模块,并把它当作一个Subversion的外部对象 – 也就是说,现在我已经意识到的变化已经完全没有被提交或推到任何地方。

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

子模块是它自己的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 

请注意,如果您在各种子模块中进行了一系列更改,则可以(或将很快) 将所有内容 一次性推送(即从父回购一次),具体如下:

 git push --recurse-submodules=on-demand 

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

学会了“ git push --recurse-submodules ”,以便有select地查看绑定到超级项目的子模块的历史logging并将其推出。

可能在这个补丁和--on-demand选项之后完成:

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

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

  • 如果使用检查,将检查所有在要修订的版本中更改的子模块提交在远程可用。
    否则,推送将被中止并以非零状态退出。
  • 如果on-demand ,则会推送修订中要更改的所有子模块。
    如果按需不能推动所有必要的修改,它也将被中止并以非零状态退出。

该选项仅适用于一个嵌套级别。 其他子模块内子模块的更改将不会被推送。

您可以像处理普通存储库一样处理子模块。 要传播上游的更改,只需按照通常在该目录中的方式进行提交和推送即可。

 $ git submodule status --recursive 

在这种情况下也是救命的人。 你可以使用它和gitk --all跟踪你的sha1,并validation你的子模块是指向你自己认为的。

在提交和推送之前,需要为子模块启动一个正在运行的存储库树。 我正在使用乌龟,做下列事情:

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

  • 如果有这样的文件,它包含超模块git目录的path
  • 删除这个文件
  • 做git初始化
  • 做git添加远程path的子模块使用
  • 按照下面的说明

如果有.git文件,那么Surry就是追踪本地树的.git目录。 你仍然需要一个分支(你可以创build一个)或切换到主(有时不工作)。 最好做的是 – git fetch – git pull。 不要忽略提取。

现在你的提交和提交将与你的出处/主人同步