我该如何“承诺”?git子模块的变化?

在我的天真中,我建立了一个git子模块,并把它当作一个Subversion外部模块来对待——也就是说,它现在充满了我刚刚意识到还没有提交或推送到任何地方的更改。

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

278686 次浏览

< / em > < em >子模块是它自己的回购/工作区域< em > < / em >,有自己的.git目录。

因此,首先commit/push你的< em > < / em >的子模块改变:

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

然后,更新你的< em > < / em >主要项目来跟踪< / em > < em >子模块的更新版本:

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

可以像对待普通存储库一样对待子模块。要向上游传播您的更改,只需在该目录中提交和推送即可。

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

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

  • 如果有这样的文件,它包含了超级模块git目录的路径
  • 删除该文件
  • 执行git初始化
  • git是否添加了用于子模块的远程路径
  • 遵循下面的说明

如果有。git文件,肯定有跟踪本地树的。git目录。 您仍然需要一个分支(您可以创建一个)或切换到master(有时不起作用)。 最好的办法是 - git获取 -混蛋拉。

现在你的提交和拉取将与你的源/主同步

注意,如果你已经在各个子模块中提交了一堆更改,你可以(或很快就能)一气呵成(即从父repo中推送一个),使用:

git push --recurse-submodules=on-demand

git1.7.11 (Git 1.7.11.rc1)提到:

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

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

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

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

  • 如果使用check,将检查所有在要推送的修订中更改的子模块提交是否在远程上可用 否则,推送将被中止,并以非零状态退出。李< / >
  • 如果使用on-demand,所有在要推送的修订中改变的子模块都将被推送 如果按需操作不能推动所有必要的修订,它也将被中止,并以非零状态退出

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

$ git submodule status --recursive

在这种情况下也是救命稻草。你可以使用它和gitk --all来跟踪你的sha1,并验证你的子模块指向你认为它们是什么。