在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方
开源repo的更新。另外一方面如果我们自己在开发一个网站的项目,这个项目一般分为前端和后端两个相对独立的子项目,特别是前端的repo可能在不同的项目中共享,那么这时,你就可能希望将项目分开为前端和后端两个repo,如何管理这种情况呢?一个比较好的方案就是使用git的submodule功能。
假设我们的父repo在prepo目录,sumodule newtestrepo希望放在prepo/submods/newtestrepo这个目录,首先我们cd submods目录,
1. 在submods目录下执行:git submodule add https://github.com/cnweibo/newtestrepo.git 这个命令将在prepo目录下创建.gitmodules文件以及在prepo/submods/目录下创建newtestrepo目录用于保存newtestrepo内容。.gitmodules文件包含以下内容:
[submodule "submods/newtestrepo"] path = submods/newtestrepo url = https://github.com/cnweibo/newtestrepo.git
注意:在1.8版本git之前,上述命令必须在preop的root目录下执行!
2.执行git status,则发现有两个变更需要commit
(newcnweibo_branch)*$ git status On branch newcnweibo_branch Your branch is up-to-date with ‘origin/newcnweibo_branch‘. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: ../.gitmodules new file: newtestrepo
3.执行git commit将增加submodule newtestrepo这个commit做一下提交
(newcnweibo_branch)*$ git commit -m "intro newtestrepo submodule" [newcnweibo_branch 2bb87a3] intro newtestrepo submodule 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 submods/newtestrepo
4. git push 将上述修改放到preop的中央库中去以便其他teammember使用
5. 如何在prepo这个项目中修改submodule呢?git checkout master 进入newtestrepo的master branch, 修改文件,commit,随后git push,注意这里的push是将submodule push到中央库中。注意:submodule/newtestrepo目录下不再有.git目录,而只有一个.git文件,这一点很是奇妙!
6. 注意,这时如果我们到prepo的目录中,git status发现我们又有了两个没有commit的commit。
随后我们需要将prepo也做push以便将上述两个commits递交.
之所以在submodule中修改并且push后还要在prepo中push是因为我们的父repo其实是引用了子module的一个snapshot,子module修改后,父repo并没有修改对版本的引用,因此需要commit来反映这个变化。