首页 > 其他分享 >使用git子模块管理项目

使用git子模块管理项目

时间:2023-04-01 11:55:25浏览次数:47  
标签:git sub 项目 jun module1 模块 main

使用git子模块管理项目

简介

开发过程中,往往需要将将项目拆分成不同的模块,Git子模块(git submodule)可以协助我们高效地进行项目管理。另外,子模块的思想也能够强化模块间的独立性,显著降低模块间的耦合度。

参考链接

官方文档:https://git-scm.com/book/zh/v2/Git-工具-子模块<br>

《Pro Git》的 子模块章节,https://www.ycmbcd.com/doc/progit/

子模块的基本使用

创建主模块

  • github上创建主模块工程,克隆到本地
    jun@jun:~/work/github$ git clone [email protected]:embedded-jun/main-module.git
    

创建子模块

  • github上创建子模块工程

加入子模块

  • git submodule add参数

    git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
    
  • 将子模块加入到主模块,加入主模块时如果不指定路径,默认就是当前目录

    jun@jun:~/work/github$ cd main-module/
    jun@jun:~/work/github/main-module$ git submodule add [email protected]:embedded-jun/sub-module1.git
    
  • 查看子模块

  • git submodule查看子模块, 可以看到当前追踪的子模块 commit id

    jun@jun:~/work/github/main-module$ git submodule
     5b30473ad657858aa43662b7acdd69538eb3b0f5 sub-module1 (heads/main)
    
  • 查看 .gitmodules文件,该文件中说明了子模块的 相对路径以及 url

    jun@jun:~/work/github/main-module$ cat .gitmodules
    [submodule "sub-module1"]
            path = sub-module1
            url = [email protected]:embedded-jun/sub-module1.git
    
  • 查看 .git/modules文件,该目录保存了子模块的一些相关信息

    jun@jun:~/work/github/main-module$ ls .git/modules/
    sub-module1
    jun@jun:~/work/github/main-module$ ls .git/modules/sub-module1/
    branches  config  description  HEAD  hooks  index  info  logs  objects  packed-refs  refs
    
  • 使用 git status查看

    jun@jun:~/work/github/main-module$ git status
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Changes to be committed:
    (use "git restore --staged <file>..." to unstage)
          new file:   .gitmodules
          new file:   sub-module1
    
  • 此时子模块还没有真正加入到主模块中,如果执行 git submodule deinit删除子模块时会报错,必须commit一次,才算真正加入了子模块

    jun@jun:~/work/github/main-module$ git commit -m "feat: add submodule sub-module1"
    [main 0089fb8] feat: add submodule sub-module1
    2 files changed, 4 insertions(+)
    create mode 100644 .gitmodules
    create mode 160000 sub-module1
    

删除子模块

  • git submodule deinit参数
    git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
    
  • 删除
    jun@jun:~/work/github/main-module$ git submodule deinit ./sub-module1/
    Cleared directory 'sub-module1'
    Submodule 'sub-module1' ([email protected]:embedded-jun/sub-module1.git) unregistered for path 'sub-module1'
    jun@jun:~/work/github/main-module$ git rm ./sub-module1/
    rm 'sub-module1'
    
  • git status查看
    jun@jun:~/work/github/main-module$ git status
    On branch main
    Your branch is ahead of 'origin/main' by 1 commit.
    (use "git push" to publish your local commits)
    
    Changes to be committed:
    (use "git restore --staged <file>..." to unstage)
          modified:   .gitmodules
          deleted:    sub-module1
    
  • 查看 .gitmodules文件的变化,可以看到子模块相关信息已经被删除了
    jun@jun:~/work/github/main-module$ git diff --cached .gitmodules
    diff --git a/.gitmodules b/.gitmodules
    index 8961d31..e69de29 100644
    --- a/.gitmodules
    +++ b/.gitmodules
    @@ -1,3 +0,0 @@
    [submodule "sub-module1"]
         path = sub-module1
         url = [email protected]:embedded-jun/sub-module1.git
    
  • 做一次提交
    jun@jun:~/work/github/main-module$ git commit -m "feat: delete submodule sub-module1"
    [main 8499fe4] feat: delete submodule sub-module1
    2 files changed, 4 deletions(-)
    delete mode 160000 sub-module1
    

更新子模块

  • 在子模块中创建并提交文件main.cpp

    jun@jun:~/work/github/main-module/sub-module1$ git status
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Untracked files:
    (use "git add <file>..." to include in what will be committed)
          main.cpp
    
    nothing added to commit but untracked files present (use "git add" to track)
    jun@jun:~/work/github/main-module/sub-module1$ git add .
    jun@jun:~/work/github/main-module/sub-module1$ git commit -m "feat:add main.cpp"
    [main 8332956] feat:add main.cpp
    1 file changed, 6 insertions(+)
    create mode 100644 main.cpp
    
  • 在父目录即主模块中使用git status查看状态,可见主模块并不知道子模块中哪些文件做了修改,只知道子模块有变化

    jun@jun:~/work/github/main-module$ git status
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git restore <file>..." to discard changes in working directory)
          modified:   sub-module1 (new commits)
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  • 在主模块中使用git diff查看有哪些变化,可见只有.gitmodules中子模块的commit id发生了变化

    jun@jun:~/work/github/main-module$ git diff
    diff --git a/sub-module1 b/sub-module1
    index 5b30473..8332956 160000
    --- a/sub-module1
    +++ b/sub-module1
    @@ -1 +1 @@
    -Subproject commit 5b30473ad657858aa43662b7acdd69538eb3b0f5
    +Subproject commit 8332956869efb53b6952c9bdbb687317f78362ac
    

  • 在主模块中更新子模块的commit id

克隆含有子模块的项目

git clone [email protected]:embedded-jun/main-module.git --recursive

致谢

感谢大佬鹏哥近三年来的指导,恭喜鹏哥更进一步!
莫问前程事,飒然沙上蓬
他日见张禄,绨袍怀旧恩

标签:git,sub,项目,jun,module1,模块,main
From: https://www.cnblogs.com/zhijun1996/p/17278357.html

相关文章

  • [1]Python基础语法-【12】模块导入
    模块是Python中的一种重要组件,它可以让你将代码分割成更小、更易于维护和重复使用的部分。在Python中,你可以使用import语句将模块导入到你的代码中。本篇文章将详细介绍Python中的模块导入。模块的定义在Python中,模块是一组相关的函数、类和变量的集合,它们通常被存储在单......
  • Terraform 系列-Terraform 项目的典型文件布局
    系列文章......
  • GitHub OAuth 第三方登录示例
     ⇐  ⇒GitHubOAuth第三方登录示例教程作者:阮一峰日期:2019年4月21日这组OAuth系列教程,第一篇介绍了基本概念,第二篇介绍了获取令牌的四种方式,今天演示一个实例,如何通过OAuth获取API数据。很多网站登录时,允许使用第三方网站的身份,这称为"第三......
  • 项目一众筹网07_01_SpringSecurity框架简介和用法、SpringSecurity负责的是 权限验证
    项目一众筹网07_01_SpringSecurity文章目录项目一众筹网07_01_SpringSecurity01简介SpringSecurity负责的是权限验证02-SpringSecurity简介03-Spring的注解模式maven引入Spring环境04-准备测试环境05-加入SpringSecurity环境06-实验1-放行首页和静态资源(下一篇)01简介现在主流的权......
  • 项目一众筹网06_01_【权限控制】角色和权限分配、Admin分配Role、Role分配Auth、前端j
    系列文章目录众筹网文章目录系列文章目录01-角色和权限分配-引入02-Admin分配Role-目标和思路03Admin分配Role创建中间表有些表是不需要实体类的自然也就不需要做逆向工程04-Admin分配Role-前往分配页面-handler方法05-Admin分配Role-前往分配页面-Service方法和SQL06-Admin分......
  • 项目一众筹网06_02给用户分配角色、执行用户角色的分配、提交的 只是我们选中的解决、
    项目一众筹网06_02项目一众筹网06_02文章目录项目一众筹网06_0209-Admin分配Role-执行分配-handler方法(执行角色分配的后端代码开始)隐藏域的东西,不用传,点击submit(提交)的时候就会传过去,如下图允许参数是空值10-Admin分配Role-执行分配-Service方法==重复问题==11-Admin分配Role-执行......
  • 项目一众筹网05_03_树的节点的增删改查、radio、代码里面实现模拟用户点击重置、每次
    系列文章目录文章目录系列文章目录18-添加子节点-目标和思路19-添加子节点-前端:打开模态框20-添加子节点-前端:发送Ajax请求==代码里面实现模拟用户点击重置==21-添加子节点-后端==bug发现异步的问题:每次加载数据的时候都要考虑一下异步的问题==22-更新节点-目标和思路23-更新节点......
  • 项目一众筹网09_00_SpringSecurity
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这......
  • 项目一众筹网05_0项目阶段性总结,SSM框架_项目开发注意事项,,不要随意动框架预定好的结构
    系列文章目录文章目录系列文章目录一、框架搭建好之后,项目开发阶段,各就各位,尽量不要新建包名二、mybatis里面sql结束不要带分号三:实体的属性名最好跟数据库的字段保持一模一样,这样mybatis才不会因为大小写什么的而识别不了四:不是主键可以添加唯一约束吗五、idea里面的配置,需要注意......
  • 项目一众筹网05_02_[树形开发]菜单管理、API文档发布到web服务器、配置文件里面修改to
    系列文章目录文章目录系列文章目录08-页面显示树形结构-前端-使用真实数据09-准备zTree的API文档(因为现在没有图标)==API文档发布到web服务器上去==配置文件里面修改tomcat的默认端口号(只需改动3个地方)10-前端-显示图标-分析思路(-页面显示树形结构)11-前端-显示图标-代码实现(-页面......