使用git子模块管理项目(代码片段)

     2023-04-01     345

关键词:

使用git子模块管理项目

简介

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

参考链接

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

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

子模块的基本使用

创建主模块

  • github上创建主模块工程,克隆到本地
    jun@jun:~/work/github$ git clone git@github.com: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 git@github.com: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 = git@github.com: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\' (git@github.com: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 = git@github.com: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 git@github.com:embedded-jun/main-module.git --recursive

致谢

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

[转]使用gitsubmodule管理子模块(代码片段)

...ithub.com/jjz/pod-project 子项目:https://github.com/jjz/pod-library使用场景基于公司的多项目,我们提取了一个公共的类库提供给多个项目使用,但是这个library怎么和git在一起方便的管理呢?需要解决以下的几个问题:如何在git项目中... 查看详情

git子模块:gitsubmodule(代码片段)

...者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景。这里使用Git的gitsubmodule命令为一个git项目添加子git项目。可以使用gitsubmodu 查看详情

gitsubmodule管理项目子模块(代码片段)

使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。常用命令gitclone<repository>--recursive递归的方式克隆... 查看详情

gitsubmodule管理项目子模块(代码片段)

使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。常用命令gitclone<repository>--recursive递归的方式克隆... 查看详情

gitsubmodule管理项目子模块(代码片段)

使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。常用命令gitclone<repository>--recursive递归的方式克隆... 查看详情

gitgitsubmodule管理项目子模块(代码片段)

文章目录1.概述2.使用场景3.如何使用3.1.创建带子模块的版本库3.2.克隆带子模块的版本库3.3.修改子模块3.4.更新子模块3.5.删除子模块4.删除子模块5.我们的使用1.概述参考:https://www.cnblogs.com/nicksheng/p/6201711.html并且修改。2.使用... 查看详情

gitgit使用submodule管理子模块报错pathspecdidnotmatchanyfiles(代码片段)

...。故事背景参考:【git】GitSubmodule管理项目子模块我们的使用如下我们有个项目web是专门放web界面的仓库名称叫ext-xxx-webext-xxx-web然后我们一个后端项目如下 查看详情

git-子模块脏-visualstudio项目文件(代码片段)

...我目前的项目,另一个是子模块。整个项目都在git中。我使用VisualStudio为项目生成的gitignore。子模块的一部分也是子模块项目的VisualStudio解决方案和项目设置。我已将此子模块添加到我的解决方案中,但我需要更改包含子目录和... 查看详情

gitsubmodule管理子项目(代码片段)

使用场景拆分项目,当项目越来越大之后,我们希望子模块可以单独管理,并由专门的人去维护,这个时候只可以使用gitsubmodule去完成。常用命令gitclone<repository>--recursive#递归方式克隆整个项目gitsubmoduleadd<repository>path#... 查看详情

gitsubmodule管理子项目(代码片段)

使用场景拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 gitsubmodule 去完成。常用命令gitclone<repository>--recursive#递归方式克隆整个项目gits... 查看详情

sh将子模块添加到git项目(代码片段)

查看详情

Git子模块与依赖管理?

...】:2018-08-1423:51:59【问题描述】:在我工作的地方,我们使用一个名为apacheIvy的工具来进行依赖管理。但是,我最近一直在开发自己的项目,其中包含多个存储库,因此,我使用git超级项目来维护所有存储库。git子模块对我来说... 查看详情

git添加子模块(代码片段)

首先cd到项目需要添加子模块的文件夹然后执行:gitsubmoduleadd[子模块git地址]最后提交、推送,完成!参考文档:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97 查看详情

手把手教你把git子模块更新到主项目(代码片段)

本文以skywalking-rocketbot-ui子模块合并到skywalking为例,手把手教你如何把Git子模块更新到主项目中去。首先,把fork的skywalking项目克隆到本地:OneMoreMINGW64/d/code$gitclonehttps://github.com/heihaozi/skywalking.gitskywalkingCl 查看详情

一个项目下两个模块,被git识别为两个项目,导致只能推送一个模块上去(代码片段)

问题重现使用IDEA创建了一个maven父项目,然后在父项目里建立了maven子模块(Module),然后点IDEA下方的Terminal,输入vuecreateweb,在父项目下建立了一个vue的子模块。项目结构如下:-maven父项目-maven子Modul... 查看详情

使用git管理项目常用操作(代码片段)

git管理项目情景:一个开发团队开始共同开发一个新项目,每个人负责的功能模块不同,通过git仓库提交管理项目代码,项目进行到一半的时候,有一个新来同事,加入了项目开发,一般"常规性"... 查看详情

gitsubmodule管理项目子模块

使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。常用命令gitclone<repository>--recursive递归的方式克隆... 查看详情

如何管理与 git 子模块的冲突?

】如何管理与git子模块的冲突?【英文标题】:HowdoImanageconflictswithgitsubmodules?【发布时间】:2010-10-2400:37:34【问题描述】:我有一个git超级项目,它引用了几个子模块,我正在尝试锁定一个工作流程,以便我的项目成员在其中工... 查看详情