git submodule

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git submodule相关的知识,希望对你有一定的参考价值。

参考技术A

添加后会多一个 .gitmodules 文件,文件的内容只是保存submodule的引用信息,包括路径和repo地址

添加完后需要在主项目 git commit 提交新增子项目文件夹以及 .gitmodules 文件的修改

在子项目加入到项目的时候,其实做了这样三件事:

所以在当前项目push到remote repository的时候,只是更新了引用的 commit id ,那么在其他人clone项目的时候,就可以获取子项目的 commit id ,然后在 git submodule update 的时候获取子项目 commit id 所表示的commit

查看子模块的commit id,如果子模块没有被checkout,前面会有 - ,那么就需要 git submodule init , git submodule update

clone带有submodule的项目的两种方法:

其实相当于

注意,在clone之后, cd submodule/ ,然后 git status ,你会看到这样的状态

也就是说,现在是 detached HEAD ,使用 git branch 就可以查看到

所以需要 git checkout master 到master分支,然后在master分支上修改

为什么呢?因为父项目不记录子模块的修改,只记录commit id,所以clone的时候只获取到对应的commit,而不在任何分支上,但是master分支的commit id和HEAD保持一致,所以只要 git checkout master ,而不需要新建分支

注意: 只有子项目内容更新,就需要更新父项目引用的子项目的commit id

其实子项目和父项目只是独立的git项目,所以其他操作和一般git项目一样,在子项目修改,需要

其实普通的git项目一样操作,然后需要在父项目更新引用的子项目commit id,有 两 一种方法:

为什么这种方法不行呢,其实是个坑!就是你 git submodule update 之后,你的子项目会恢复到你父项目引用的那个commit,也就是不是最新的commit,此时 git status 是干净的,就像第一次 git clone 项目然后 git submodule init , git submodule update 一样,子项目指向的是父项目引用的那个commit,所以此时把子项目 git checkout master 之后,再切回到父项目,使用 git status ,你会发现提示子项目有新的commit,所以还是需要父项目更新引用的子项目的commit id

注意: 如果更新submodule的时候有新的commit id产生,需要在父项目产生一个提交,用来更新对子项目commit id的引用
两种方法:

子项目一旦产生变动,有新的commit id,父项目必需产生一个提交,更新对子项目commit id的引用

Git Submodule使用完整教程
使用Git Submodule管理子模块
Git submodule的坑

git add submodule

  1. first to the submodule you want to add, git init, add remote and push
  2. go back to the parent folder, git submodule add ./your_submodule

以上是关于git submodule的主要内容,如果未能解决你的问题,请参考以下文章

Git 常用操作 - git clone/git checkout -b/git diff/git push/git pull

Git 学习路线

从0到1带你掌握git(一分钟掌握git)--git如何下载?git如何使用?git是什么?git怎么获取文件?

Git认识与使用 Git

Git认识与使用 Git

Git认识与使用 Git