git的submodule功能详解

来源:互联网 发布:火车头采集js分页 编辑:程序博客网 时间:2024/05/16 08:55

声明:本文转载自http://www.open-open.com/lib/view/open1396404725356.html

  • 前言
  • 准备工作
  • TortoiseGit上git submodule功能实现
    • 添加子模组的步骤
      • 第一步使用submodule add添加子模组
      • 第二步查看gitmodules的内容
    • 克隆带子模组的版本库的步骤
      • 第一步克隆super主版本库
      • 第二步克隆子模组
    • 对主Git库工作区作commitcheckoutrevertpullpush等更改Git工作区内容的操作时查看Submodule目录下内容的效果
      • 1 对主Git库工作区作commit操作
      • 2 对主Git库工作区作checkout操作
      • 3 对主Git库工作区作revert操作
      • 4 对主Git库工作区作push操作
      • 5 对主Git库工作区作pull操作
    • 对submodule下的内容进行修改后commitpush对submodule目录作pull
      • 对submodule目录作pull
    • 移除Submodule
      • 第一步用Deletekeep local 将目录或文件命令从git的索引库中移除子模块目录
      • 第二步删除物理文件
      • 第三步删除gitmodule文件
      • 第四步删除gitconfig的submodule配置源文件
      • 第五步删除后提交更改

1. 前言

项目的版本库在某些情况下需要引用其他版本库中的文件,例如有一套公用的代码库,可以被多个项目调用,这个公用代码库不能直接放在某个项目的代码中,而是要独立为一个代码库,那么其他要调用公用的代码库该如何处理?分别把公用的代码库拷贝到各自的项目中会造成冗余,丢弃了公共代码库的维护历史,这些显示不是好的办法,现在要了解的git子模组(git submodule)就解决了这个问题。

Git 子模块功能允许你将一个Git仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。

本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

2. 准备工作

首先需要两个版本库例如:

1) 一个公共的版本库(例如:libA.git)

git@gitlab.szreach.com:fengyang/liba.git

2) 一个引用公共版本库的主版本库(例如:super.git)

git@gitlab.szreach.com:fengyang/super.git

3. TortoiseGit上git submodule功能实现

1. 添加子模组的步骤

第一步:使用submodule add…添加子模组

在需要作添加子模组的Git版本库中右击,选择“TortoiseGit->Submodule Add…”,在“Repository:”里面输入需要添加子模组的版本库路径,在“Path:”

中输入添加子模组存放的目录路径。如下图所示:

这里写图片描述

此时查看需要添加子模组的Git工作区的目录结构。在根目录下多了一个.gitmodules文件,并且公共代码库被克隆到lib/lib_a目录下。

这里写图片描述

第二步:查看.gitmodules的内容

.gitmodules的内容记录着含子模组存放的目录路径及子模组版本库的路径

这里写图片描述

注:此时工作区尚未提交,完成提交后,子模组才算正式完成在需要作添加子模组的Git版本库中创立。

注:此主版本库(super.git)就变成了一个包含子模组的版本库。

2. 克隆带子模组的版本库的步骤

克隆带子模组的git库,并不能自动将子模组的版本库克隆出来,对于只关心项目本身的数据,而不关心项目引用的外部项目数据的用户,这个功能非常好,数据没有冗余而且克隆的速度也很快。

第一步:克隆super主版本库

在工作区中克隆主主版本库后,会发现子模组的版本库并没有克隆,只有将存放子模组版本库的目录克隆下来了。

这里写图片描述

存放子模组版本库的目录路径

第二步:克隆子模组

如果需要克隆出子模组形式引用的外部库,首先需要执行Submodule Update操作。

在需要作克隆子模组的Git工作区中右击,选择“TortoiseGit->Submodule Update…”,点击“OK”即可。

这里写图片描述

执行Submodule Update…操作后就会把子模组的版本库克隆下来。

这里写图片描述

3. 对主Git库工作区作commit、checkout、revert、pull、push等更改Git工作区内容的操作时,查看Submodule目录下内容的效果

1) 对主Git库工作区作commit操作

当在主Git库工作区中变更到达一个适当状态时,我们需要将这些变更提交到Git库,作版本备份和跟踪。

方法:

在工作区内右击,选择“ Commit-> “当前分支名称” ”,在Commit窗口中,选择需要提交的变更path,填写提交说明,点击“Ok”。

这里写图片描述

结论:在主git工作区作commit操作,只是将主Git工作区的变更历史提交到主Git本地库中,对Submodule没有任何影响。

2) 对主Git库工作区作checkout操作

当在主Git库工作区中想要切换到其他某个分支、某个tag、某个commit历史记录。

我们这里举个特殊的例子:

切换到某个commit历史记录(如在主版本库中提交子版本库的历史记录)

方法:

在Git工作区内的某目录上右击,选择“Swicht/Checkout…”在Swicht/Checkout…Checkout窗口中,在Switch to Commmit中列出需要切换的commit历史记录,在此列表中选择需要切换到的commit历史记录,以后点击“Ok”按钮。

这里写图片描述

这里写图片描述

这里写图片描述

注:由于切换到的是在主版本库中提交子版本库的那条历史记录,因此子模组中状态也会改换,也需要在子模组中执行切换。

执行Submodule Update操作即可。

这里写图片描述

3) 对主Git库工作区作revert操作

当在主Git库工作区中这次变更有错误时,就可以使用revert操作来撤销这次次操作。

方法:

在工作区内右击,选择“Revert”,在Revert窗口中,选择需要撤销的变更path,点击“Ok”。

这里写图片描述

这里写图片描述

结论:在主git工作区作revert操作,只是将主Git工作区某次的变更操作给撤销,此次操作之前的commit都会被保留,且对Submodule没有任何影响。

4) 对主Git库工作区作push操作

当在主Git库工作区中将主Git本地库的数据推送到主Git远程库中。

方法:在工作区的目录上(不要在文件上)右击,选择“Git Sync…”

“Local Branch”,”Remote Branch”,“Remote URL”这3栏必须正确才能“推”数据。

这里写图片描述

结论:在主git工作区作push操作,只是将主Git本地库的变更历史推送到到主Git远程库中,对Submodule没有任何影响。

5) 对主Git库工作区作pull操作

当在主Git库工作区中将主Git远程库的拉取到主Git本地库中。

方法:在工作区的目录上(不要在文件上)右击,选择“Git Sync…”

“Local Branch”,”Remote Branch”,“Remote URL”这3栏必须正确才能“拉”数据。

这里写图片描述

结论:在主git工作区作pull操作,只是将主Git远程库的变更历史拉取到到主Git本地库中,对Submodule没有任何影响。

4. 对submodule下的内容进行修改后commit、push,对submodule目录作pull

在执行Submodule Update…操作更新出子模组后,都以某个具体的提交版本进行检出,进入子模组目录,会发现其处于非跟踪状态。

这里写图片描述

显然这种情况下,如果修改lib/lib_a下的文件,提交就会丢失。下面介绍如何在检查的子模组中修改,以及如何更新子模组。

在子模组中切换到master分支(或者其他想要修改的分支)后在进行修改。

  • 切换到master分支,然后在工作区做一些改动。

这里写图片描述

  • 执行commit后,并且推送到子模组库中后。
  • 回到主版本库中。在主版本库中查看状态,在主版本库中可以看到子模组已修改,包含了更新的提交。
  • 需要将修改提交在主版本库中进行推送。

这里写图片描述

对submodule目录作pull

当子模组版本库中有新的提交历史记录,就需要做pull操作来更新。

这里写图片描述

注:对子模组库中做了pull操作,同时需要对调用子模组库的主版本库中也要做Pull操作。

如下图所示:

这里写图片描述

注意:进入子模组目录,会发现其处于非跟踪状态。显然这种情况下,如果修改lib/lib_a下的文件,提交就会丢失。提示如下:

这里写图片描述

5. 移除Submodule

第一步:用Delete(keep local) 将目录或文件命令从git的索引库中移除子模块目录

方法:

在工作区内目录或文件上右击,选择“Delete(keep local)”,在Delete窗口中,点击“Remove”。

Delete(keep local)把目录lib/从git的索引库中移除,但是对目录lib/本身并不进行任何操作。

因此需要彻底删除。

第二步:删除物理文件

第三步:删除.gitmodule文件

第四步:删除.git/config的submodule配置源文件

删除如下图所示红框的部门

这里写图片描述

第五步:删除后,提交更改

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东上面买的商品不符合实际怎么办 在京东买东西卖家迟迟不发货怎么办 淘宝商家买的货一直不到怎么办 国美买的格力空调发票丢了怎么办 国美实体店发票丢了怎么办 我在苏宁买的冰箱发票丢了怎么办 信用卡家庭电单位电话换了怎么办 常住户囗和实际住址没房子怎么办 退货淘宝极速退款 卖家拒收怎么办 淘宝退货极速退款后卖家拒收怎么办 蘑菇街付款成功怎么申请退款怎么办 淘宝上拍错地址联系卖家不管怎么办 收到货想退款卖家不同意怎么办 小米小店复合通过qq群怎么办 买了火车票在订单上查不到怎么办 用支付宝付款扣款没成功怎么办 在京东买东西只收到空盒子怎么办 魅族移动数据是灰色的怎么办? 魅族手机账号密码忘记了怎么办视频 淘宝购物退货把单号写错了怎么办 天猫想退货商家不给退货地址怎么办 天天爱消除四星宠物等级已满怎么办 店不干了店里面的财神怎么办 微信显示登陆注册语言打不开怎么办 三星手机解锁以后突然不量怎么办 耐克、阿迪品牌鉴定买到假货怎么办 小米4c盒子不支持有线连接怎么办 一个手机号绑着两个小米账号怎么办 小米5s手机听筒声音小怎么办 淘宝上买手机买到翻新怎么办 小米6用久了很卡怎么办 淘宝商家发错误的退货地址怎么办 买苹果手机时查到了翻新机该怎么办 荣耀9青春版玩王者卡怎么办 红米4x手机声音突然成破音怎么办 红米pro玩王者荣耀卡怎么办 红米手机恢复出厂设置出错了怎么办 红米恢复出厂设置出错了怎么办 应聘工作上当收押金了该怎么办 红米1s密码忘了怎么办 红米1s刷机后开不了机怎么办