1 submoude 介绍

(1)项目很大参与开发人员多的时候,需要将各个模块文件进行抽离单独管理。

(2)使用git submodule来对项目文件做成模块抽离,抽离出来的文件可单独成为一个git仓库。整个主项目对抽离出来的子项目(子模块)有依赖关系,却又并不关心子项目(子模块)的内部开发流程细节;

(3)代码如果全员可见,可以做成分支进行管理;如果代码不可见,可以创建为子仓库(独立一个git 仓库);子仓库管理模块代码,主仓库定时更新

(4)简单理解:项目工程为一个仓库;模块为一个仓库;主仓库操作git module命令来使用这个模块子仓库;主项目,子模块可由不同的开发人员维护。

2 带Submodule 模块的主项目仓库环境搭建

(1)克隆一个主项目仓库git_test

命令:git clone git@gitee.com:monkeyqiyu/git_test.git

 (2)添加模块子仓库的路径到主项目中

执行添加子仓库的命令:

 git submodule add git@gitee.com:monkeyqiyu/git_submodule.git 

 //其中模块即子仓库的路径为:git@gitee.com:monkeyqiyu/git_submodule.git

子模块仓库:

注:git submodule 还支持嵌套开发

(3)提交代码到远程仓库

git add .

git commit - m  “添加子仓库到主仓库” 

git push origin master

3 带Submodule 模块的主项目开发操作流程

3.1主仓库开发人员A克隆代码进行开发
(1)克隆主仓库代码,子仓库代码为空

 git clone git@gitee.com:monkeyqiyu/git_test.git   

(2)执行以下命令,获取子仓库代码:

git submodule init  //初始化子仓库

git submodule update   //获取子仓库最新代码

或者直接执行:git submodule update --init --recursive

3.2子仓库和主仓库修改后操作
(1) 非子仓库代码修改跟普通git操作一样提交代码

(2)主仓库由开发人员A开发,子仓库由开发人员B进行开发:

【1】发人员B开发完后提交代码到远程仓库;

【2】开发人员A要对submodule 模块进行更新

要执行下限命令对submodule进行更新,会更新最新的内容和commit id:

git submodule update --remote   

再回到主项目仓库,对主项目进行一次提交,推送;把关联子仓库新的commit id提交推送到远程,下次克隆使用才不会出错!

远仓库主仓库中的子模块commit id有更新,点击会跳到子仓库

3. 3 开发人员A同时管理主仓库和子仓库:
【1】子仓库代码有修改,要进入子仓库目录进行一次代码提交,推送远程

git add .
git commit -m "修改index = 100"
git push origin HEAD:master

【2】再回到主项目仓库,对主项目进行一次提交,推送

git add .
git commit -m "更新子仓库index = 100"
git push origin master

注意:     

  • 如果直接在主仓库目录执行git add .是不起作用的(可以使用git status查看 生效情况,只要子项目有修改,当我们进入主项目使用 git status查看状态 都会有子项目修改的记录);
  • 必须先提交推送子仓库代码,然后到主仓库路径提交一次子仓库的更新;

 4 主仓库中删除子仓库

(1)执行要删除的部分

rm -rf 子模块目录 //删除子模块目录及源码

vi .gitmodules  //删除项目目录下.gitmodules文件中子模块相关条目

vi .git/config   //删除配置项中子模块相关条目

rm .git/module/* //删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可

git rm --cached 子模块名称

(2)重新提交推送到远程仓库

5 submodule 注意事项

(1)当远程仓库的 submodule 进行了新的提交,父代码仓库的 submodule 不会自动更新 (执行git pull 或gitsubmodule update也无用)

(2)主工程并不直接跟踪子模块的代码,而仅仅只跟踪子模块的 commit id 的改动。在执行 git submodule update 更新子模块代码时,Git 就是根据主工程所维护的 commit id 来更新子模块到指定状态的。

(3)在子模块中修改并提交了代码,必须到主工程把子模块的 commit id 提交一下提交一次;否则其它开发人员还是停留在老的commit id所致的状态

原文链接:https://blog.csdn.net/weixin_42107504/article/details/129696242

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐