Git子模块使用教程

Git子模块

1. 问题背景

​ 随着产品的日益增多,各个产品之间的业务功能会出现高度的相同性,比如产品A有串口的接收功能,产品B也有相同的串口功能,这类功能我们可以写成一个通用的串口接收模块。这样就可以避免每个产品都copy一遍代码,造成了大量的代码冗余,且后续修改也要挨个进行一遍,所以本文我们引入git 子模块的概念,就可以很好的解决这个问题。

​ Git 通过子模块来解决这个问题,子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录,它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

​ 子模块学习参考如下链接:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

2.子模块的拉取和同步修改

2.1. clone含有子模块的项目

  • 方式一

    • 克隆主仓库:url为主仓库的地址

      git clone url

    • 初始化本地配置文件

      git submodule init

    • 从该项目中抓取所有数据并检出父项目中列出的合适的提交

      git submodule update

    • 将 git submodule init 和 git submodule update 合并成一步

      git submodule update --init

  • 方式二

    克隆并更新仓库中的每一个子模块,包括可能存在的嵌套子模块

git clone --recurse-submodules url

说明:克隆下来的项目,子模块留在一个称作“游离的 HEAD”的状态。

2.2. 同步子模块的更改

  • 方式一

    进入子模块的目录下,执行

    git pull origin master

  • 方式二

    直接在主仓库下执行

    git submodule update --remote [submodule name]

    此命令默认会假定你想要更新并检出子模块仓库的 master 分支

2.3. 同步项目的更改

  • 方式一

    git pull

    git submodule update --init

    如果子模块有嵌套的子模块,则应使用 --recursive 选项

  • 方式二

    git pull --recurse-submodules

3. 子模块的推送

进入每一个子模块的目录下,依次执行

git checkout -b 'xxx' //由于拉下来的是“游离的 HEAD”的状态,所以得先切换出自己得分钟,或者切到原有分支也可

git add .

git commit -m 'xxx'

git push

一系列常规的推送指令

为了防止有些子仓库修改后没有提交的小技巧(新手不建议使用):

  • 可以将git push 命令接受可以设置为 “check” 或 “on-demand” 的–recurse-submodules参数

    • git push --recurse-submodules=check

      git push --recurse-submodules=on-demand

      git config push.recurseSubmodules check

      git config push.recurseSubmodules

4. 子模块的添加

在需要添加子模块的文件夹下执行git submodule add url即可

5.一些常用的子模块指令

  • 查看子模块更新信息

    git log -p --submodule

  • 修改子模块跟踪的分支

    git config -f .gitmodules submodule.(submodule name).branch (branch name)

    例如:submodule name为sub_1,branch name为dev;

    则git config -f .gitmodules submodule.sub_1.branch dev。

  • 子模块遍历

    git submodule foreach 'git命令'

    例如:

    git submodule foreach 'git status'

    git submodule foreach 'git checkout master'

  • 查看子模块指向哪个commit

    git submodule status

  • 删除子模块

    git submodule deinit submodulename

    git rm submodulename

    git rm --cached submodulename

    rm -rf ./git/modules/submodulename

  • 修改子模块url

    打开.gitmodules,找到对应模块的url并修改保存,然后执行

    git submodule sync

  • 配置选项

    显示子模块的更改摘要

    git config status.submodulesummary 1

    关闭子模块的更改摘要

    git config status.submodulesummary 0

你可能感兴趣的:(git,github)