在我的天真中,我建立了一个git子模块,并把它当作一个Subversion外部模块来对待——也就是说,它现在充满了我刚刚意识到还没有提交或推送到任何地方的更改。
是否有一些简单的方法将子模块的更改提交/推送回上游的repo?对于以这种方式在独立(但链接的)存储库上进行同步开发,Git中推荐的技术是什么?
在我的天真中,我建立了一个git子模块,并把它当作一个Subversion外部模块来对待——也就是说,它现在充满了我刚刚意识到还没有提交或推送到任何地方的更改。
是否有一些简单的方法将子模块的更改提交/推送回上游的repo?对于以这种方式在独立(但链接的)存储库上进行同步开发,Git中推荐的技术是什么?
子模块是它自己的repo/工作区域,有自己的.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文件(不是目录)
如果有这样的文件,它包含了超级模块git目录的路径 删除该文件 执行git初始化 git是否添加了用于子模块的远程路径 遵循下面的说明
如果有。git文件,肯定会有跟踪本地树的。git目录。 您仍然需要一个分支(您可以创建一个)或切换到master(有时不起作用)。 最好的办法是 - git获取 -混蛋拉。不要省略fetch。
现在你的提交和拉取将与你的源/主同步
注意,如果你已经在不同的子模块中提交了一堆更改,你可以(或者很快就可以)一次性推送所有内容(即从父repo中推送一次),使用:
git push --recurse-submodules=on-demand
git1.7.11 ([ANNOUNCE] Git 1.7.11.rc1)提到:
"git push——recursive -submodules"学会了有选择地查看绑定到超级项目的子模块的历史并将它们推出。
可能在这个补丁和——demand选项之后完成:
--recurse-submodules=<check|on-demand|no>::
Make sure all submodule commits used by the revisions to be pushed are available on a remote tracking branch. If check is used, it will be checked that all submodule commits that changed in the revisions to be pushed are available on a remote. Otherwise the push will be aborted and exit with non-zero status. If on-demand is used, all submodules that changed in the revisions to be pushed will be pushed. If on-demand was not able to push all necessary revisions it will also be aborted and exit with non-zero status.
此选项仅适用于一层嵌套。对另一子模块内的子模块的更改将不会推送。
$ git submodule status --recursive
在这种情况下也是救命稻草。你可以使用它和gitk——所有这些来跟踪你的sha1,并验证你的子模块指向你认为它们是什么。