git submodule
子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
比如我们想抽象出一个组件库供多个项目使用
git submodule add <子模块git地址> <存放的文件名>
会生成: .gitmodules 和 子模块文件夹
.gitmodules 文件保存了项目 URL 与已经拉取的本地目录之间的映射,这样就能知道子模块在哪获取。如果有多个子模块,该文件中就会有多条记录。
子模块文件夹只存子项目的commit id,就能指定到对于的git header上, 父项目的git并不会记录Submodule的文件变动,它是按照commitid指定Submodule的git header
当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作子模块仓库中的某个具体的提交。
注意的是,这两个文件也像 .gitignore 文件一样受到(通过)版本控制。 它会和该项目的其他部分一同被拉取推送。
克隆含有子模块的项目
克隆一个含有子模块的项目时,默认会包含该子模块目录,但其中还没有任何文件,是空目录。 必须运行:
git submodule init 用来初始化本地配置文件
git submodule update 则从该项目中抓取所有数据并检出父项目中列出的合适的提交。
合成一步就是: git submodule update --init
如果还要初始化、抓取并检出任何嵌套的子模块:git submodule update --init --recursive
或者在克隆的时候加上参数: git clone --recurse-submodules
它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块。
修改submodule
进入submodule目录里修改后add 、commit 、push到远程服务器,然后要回到父目录,提交submodule在父项目中的改动(submodule commit id 会更新),再push
坑:子模块的分支默认不是master,也不会切到任何branch
--no-edit
git pull --no-edit
git merge dev --no-edit