Git —— submodule 操作说明

这篇具有很好参考价值的文章主要介绍了Git —— submodule 操作说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Git —— submodule 操作说明

1. add 添加子模块

# git submodule add -b master https://github.com/coolsnowwolf/lede.git ./lede
git submodule add -b <branch-name]> <git-repository-url> [local-path]
# 本地提交
git commit -m "add submodule xxxx"
# 推送到远程仓库
git push

2. checkout 子模块检出

# 有两种方式:
# 1. 使用 --recursive 参数,跟随主仓库递归 clone
git clone <your main repository url> --recursive # 此时 clone 下来的主项目会直接 clone 远程仓库中记录的 commit id 版本的子模块

# 2. 单独 checkout 子模块
git clone <your main repository url> # 不带 --recursive 递归参数时,submodule 无法被一起 clone 下来
git submodule update --init --recursive # 将 submodule 更新到远程仓库中记录的 commit id 版本

3. update 更新/切换子模块 commit id 和当前分支

这里存在一个较大的坑,默认检出的子模块并不属于任何分支,而是一个 “detached head” ,虽然可以提交更改,但是并没有本地分支跟踪提交的更改,这意味着下次更新子模块会丢失这些更改

因此在对子模块进行开发修改前,请先切换其所属分支和对应的 commit id。

# 默认添加的 submodule 的 commit id 是 add 时默认分支当前的一个 commit id,当子模块原始仓库更新后,期望切换到指定的 commit id 版本,或者像要切换分支
git pull
git submodule update # 更新本地仓库,避免出现冲突
cd <submodule dir>
git checkout <branch name> # 切换分支
git pull # 拉取新分支源码
git checkout <commit id> # 更新子模块版本

# 回到主仓库目录,提交子模块的引用版本修改
cd ..
git add . # 暂存 submodule 的引用版本修改
git commit -m "update submodule xxx from xxx to xxx" # 提交
git push # 推送到远程仓库

4. commit 提交子模块

git pull 
git submodule update # 确保提交前已将本地仓库更新到远程仓库最新版本,避免提交出现冲突
cd <submodulde dir>
git add .
git commit -am "submodule modify"
git push # 将子模块提交的更改推送至远程仓库

由于子模块和主模块是独立的两个仓库,主模块仅仅应用了子模块的 url 和 commit id。因此当子模块推送更改后,生成新的 commit id,但是主模块对子模块的引用配置并未发生更改,因此需要在主模块中同步进行提交更改。

cd ../ # 回到主模块目录
git add .
git commit -am "submodule reference modify"
git push # 推送主模块对子模块的引用记录更改到远程仓库

可以看到对于子模块的修改,我们需要分别提交和推送子、主木块的更改,当然我们也可以将 “推送至远程仓库” 这一步合并:

cd <main module dir> # 进入主模块目录
# 使用 --recurse-submodules=on-demand 选项,可以在推送主模块更改时,自动推送未推送的子模块
git push --recurse-submodules=on-demand

如果出现子模块提交了更改记录,但是未推送到远程仓库,主模块提交了子模块引用记录的变更,并完成了推送到远程仓库的操作。此时拉取主模块没问题,但是在拉取子模块时,会出现 “not our ref” 的报错。这是因为主模块引用了一个远程仓库未记录的 commit id 版本的子模块。需要在提交了变更记录的子模块中完成 push 即可。为了避免忘记推送子模块修改,仅推送了主模块的引用记录变更,可以将主模块的推送命令修改为:

# 使用 --recurse-submodule=check 选项可以自动检查子模块未 push 的错误
git push --recurse-submodule=check

当使用 “–recurse-submodule=check” 选项时,如果子模块存在未 push 情况,则当前 push 操作会报警;并且如果子模块存在 push 失败的情况时,也同样会报错。可以直接将其写入 git 配置,减少重复劳动:

git config push.recurseSubmodules check

5. modify 修改 submodule 远程仓库 url

cd <main module dir> # 进入主模块目录
# 修改主模块中 .gitmodules 中的 url
# 使用 sync 命令同步修改至 .git/config 中
git submodule sync
git commit -am "modify submodule url" # 提交修改
git push # 推送到主模块远程仓库

如果时别人修改了子模块 url,则拉取主模块的更新后,使用 sync 命令同步到本地 .git/config 中即可:文章来源地址https://www.toymoban.com/news/detail-752181.html

cd <main module dir> # 进入主模块目录
git pull # 拉取主模块更新,即获取 .gitmodule 中 url 的修改
git submodule sync # 将 .gitmodule 中的修改同步到本地仓库的配置中 .git/config

6. deinit 移除已有的 submodule

git submodule deinit <submodule name>
git rm <submodule dir>
git commit -am "remove submodule xxx"
git push

参考资料

  1. 《Git - 使用git submodule的规范操作》
  2. 《Git submodule 知识总结》
  3. 《来说说坑爹的 git submodule》

到了这里,关于Git —— submodule 操作说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用git submodule:添加、查看、更新、修改、删除、克隆含submodule的项目

    Git submodule 功能可以让我们在一个仓库中添加另一个仓库作为当前仓库的子仓库,这样既方便了代码管理,也免去我们重复造轮子的精力和时间。注意:Git submodules 只是某个仓库某一时刻的一个状态的引用,即某个 commit 的引用。 添加远程项目默认分支 添加远程项目指定分支

    2024年02月04日
    浏览(44)
  • 第1关:单循环链表的实现—链表的添加、遍历任务描述相关知识单循环链表添加操作遍历循环链表编程要求测试说明任务描述在操作单链表时,

    第1关:单循环链表的实现—链表的添加、遍历 200 任务要求 参考答案 评论42 任务描述 相关知识 单循环链表 添加操作 遍历循环链表 编程要求 测试说明 任务描述 在操作单链表时,我们有时希望从单链表中的任一结点出发都能遍历整个链表,但对于单链表来说,只有从头结点

    2024年02月06日
    浏览(47)
  • Git在已有的项目中引入Submodule子模块管理:添加、更新、删除(实战示例代码)

    在进行Git版本控制的过程中,有时候我们需要在已有的项目中引入子模块,以便复用其他独立的Git存储库的代码或文件。本文将详细介绍如何在已有项目下添加、更新和删除Git的Submodule子模块,并提供相关的示例代码。 假设我们已经有一个主项目(my-main-project)的Git存储库,

    2024年02月07日
    浏览(48)
  • 【Git】本地仓库管理远程库(GitHub)——clone(下载)、commit(添加到本地仓库)、push(提交到远程仓库)、pull(拉取)操作

    目录 使用远程仓库的目的 将本地仓库同步到git远程仓库 1.克隆远程仓库(clone) 2.新建一个文件 3.将工作区的文件添加到暂存区 4.将暂存区的文件添加到本地仓库(commit) 5.提交(同步)到远程仓库(push) 6.远程库拉取到本地库(pull) 7.团队协作开发和跨团队协作开发(开源项目) 作用:备

    2024年01月21日
    浏览(77)
  • iotop命令使用说明及iotop输出排序操作说明

    iotop是一个用来显示实时的磁盘活动 的工具,可查看哪些程序、进程或线程占用io过多。 iotop监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。它显示每个进程/线程读写 I/O 带宽。它同样显示当等待换入和等待 I/O 的线程/进程花费的时

    2024年04月12日
    浏览(50)
  • ElasticSearchHead操作说明

    (76条消息) Elasticsearch-Head(简称Head)-Java文档类资源-CSDN文库 1、下载资源包,解压 2、进入elasticsearch-head-master,执行:npm install  (在这之前需要安装nodejs) 3、输入npm run start命令启动elasticsearch-head 使用补充:本地使用的时候启动一下,服务器上如果安装一个,关闭终端就停止运行

    2023年04月16日
    浏览(49)
  • RabbitMQ 管理界面操作说明

    当我们安装好RabbitMQ,并开启了 rabbitmq_management 插件并重启RabbitMQ服务后,我们就可以访问管控台了。 rabbitmq_management 开启后,重启RabbitMQ服务,然后浏览器访问 http://localhost:15672/ 账号:guest 密码:guest 登录进去后: 点击队列名,可以进行消息数量的查看: 消息内容查看: A

    2023年04月17日
    浏览(49)
  • QGIS 3D功能操作说明

    QGIS 可以轻松快速地创建 3D 地图和可视化。 可用于3d数据效果浏览及与2D数据的对比及数据的打印输出。具体功能如下。 1.在 QGIS 中,您可以通过几个简单的步骤创建 3D 模型。      (1)在QGIS中添加3D 数据的数据层,例如DEM,以供3D功能使用。               (2) 打开

    2024年02月17日
    浏览(54)
  • C#关于byte的操作说明

    获取byte中每一位的值 获取int16中其中某几位的数值 bit 内容   11-15 预留   10 值7   6-9 值6   5 值5   4 值4   3 值3   2 值2   0-1 值1   public UInt16 ToByte() { UInt16 ret = 0x00; ret = (UInt16)(ret | ((UInt16)Waypoint 9)); ret = (UInt16)(ret | ((UInt16)Side 8)); ret = (UInt16)(ret | ((UInt16)Head 7)); ret = (UInt16)(ret

    2024年02月09日
    浏览(48)
  • ORACLE表空间说明及操作

    数据存储:表空间是数据库中存储数据的逻辑结构。它提供了用于存储表、索引、视图、存储过程等数据库对象的空间。通过划分数据和索引等对象的存储,可以更好地管理和组织数据库的物理存储结构。 性能管理和优化:通过将不同类型的数据存储在不同的表空间中,可以

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包