通过 GitExtensions 来使用 Git 子模块功能

通过 GitExtensions 来使用 Git 子模块功能

目录

一、前言

二、Git 子模块

三、子模块更改提交

四、更新子模块

五、[附] 去除最近的提交记录

独立观察员 2021 年 9 月 5 日

 

一、前言

众所周知,编程,尤其是面向对象编程的一个重要思想就是 “封装”,可重用的代码逻辑封装为方法,使用于同一业务的方法封装为类,功能相关的类封装到一个类库中,等等等等。在 .NET 中,一个项目最终生成一个类库(DLL),当然,这个项目可能会引用其它项目或类库(所以生成路径下可能好多 .dll)。而我们用开发工具 Visual Studio 打开的一般是个解决方案,解决方案中一般包含了 1~n 个项目。另外,现在的开发流程中,一般都会使用版本控制系统,比较流行的就是 Git 和 SVN,就拿 Git 来说,一般我们会将一个解决方案放在一个代码仓库中,然后托管在提供 Git 代码仓库托管服务的网站上,比较流行的就是 GitHub 和 Gitee。

 

当我们有两个以上的相互独立的解决方案要共用一个类库项目时,一般有以下几种方法:

1、多个解决方案分别引用相同路径的项目;(缺点:只适用于代码仅在本地维护的场景)

2、将该项目代码分别拷贝到各解决方案目录下进行引用;(缺点:容易造成版本不一致的问题)

3、将该项目生成为库文件(如 .dll 文件)然后分别引用;(缺点:同样存在版本问题,且不方便进行代码修改)

4、将该项目打包上传到公共或私有的 NuGet 库中,然后引用;(缺点:适用于提供给其他人使用的场景,不利于代码的修改学习)

 

可以看到,以上方法都有这样那样的缺点,那么有没有其它比较好的方法呢?答案就是使用本文将要介绍的 Git 子模块(submodule)功能。

 

既然叫 Git 子模块功能,那么自然是和 Git 深度绑定的。正所谓工欲善其事必先利其器,我先来推荐一个 Git 工具 ——GitExtensions。GitExtensions 是一款类似于 TortoiseGit 的 Git 图形化工具,安装之后既可以当作桌面软件使用,也可以再安个 VS 插件,以便直接在 VS 中打开操作界面。使用方法可略微看看本人五、六年前写的文章《使用 Git Extensions 简单入门 Git》,区别是,现在的版本没有整合 Git 和 KDiff3 了,需要自己安装,然后 VS 插件可在微软网站上下载。(本段中的下载地址请阅读原文)

 

二、Git 子模块

那么安装好了之后,如何添加 Git 子模块呢?先不急,我们先来看看添加过 Git 子模块后的目录中会有什么变化:

 

可以看到,就是多了个 .gitmodules 文件,打开看看内容吧:

 

文件内容显示,当前有两个子模块,分别列出了模块名、本地存放的目录、远程仓库地址、分支名。理论上,添加的话可以直接修改这个文件,当为了保险起见(不知道 Git 的内部操作),建议还是通过命令或图形界面来维护 Git 子模块。命令的方式可以参考网上的文章《git submodule 的使用(.gitmodules 文件子模块加载)》,本文就不再赘述了。下面来介绍如何使用 GitExtensions 进行相关的图形化界面操作。

 

首先,在 Git 文件夹中右键,点击 “GitExt Open repository”:

 

在打开的 Git 仓库管理界面,点击 档案库 --> 管理子模块:

 

可以看到两个现存的子模块的信息,点击 新增子模块 可进行新增,填上 公共仓库路径、本地路径、分支 即可新增了,就是这么简单:

 

另外三个功能是 同步、更新、移除,更新和移除很好理解,同步大概就是将子模块中修改的内容提交推送吧,我也没用过,我一般就是进入子模块目录,将其当做独立的 Git 目录来进行提交推送的。

 

当我们克隆带有 Git 子模块的仓库时要记得勾上 “初始化所有子模块” 选项,不然的话克隆结束之后子模块目录不会出现:

 

我们打开子模块的目录,和普通 Git 目录相比,就是没有了 .git 文件夹,而是一个 .git 文件,里面写明了当前模块的 git 存储位置:

 

三、子模块更改提交

下面来说说常规的使用方法,我们先在子模块 WPFTemplateLib 的目录中新建一个测试文件:

 

然后在 GitExtensions 的主界面就能看到检测出变动了,提示说有一项可以提交,而且标示出了是在子模块中产生的变动:

 

可以直接点击提交,不过提交信息不是很明确:

 

我一般选择切到子模块界面进行提交,切换方法就是点击状态栏一个像鱼雷一样的图标:

 

这样提交信息就比较清晰了:

 

刚才如果只是点的 “提交”,那就再 “推送” 一下:

 

推送完成之后,看分支图上还是有一个虚线框的分支标记,这就是说明父工程还是引用的上个版本的本模块:

 

我们再切换到父工程:

 

可以看到还是有可提交标志,这里其实是提交对子模块的引用信息(引用哪个提交版本)的更改:

 

提交界面如下(注意和之前的进行对比),显示了新旧的版本信息:

 

提交(未推送)之后再切到子模块,虚框分支标记就消失了:

 

四、更新子模块

接下来演示一下更新子模块的操作,我们先复位一下父工程,在上个提交上右键 --> 复位当前分支到此处:

 

复位方式这里选择 混合模式:

 

回到了如下状态:

 

由于我们之前提交子模块时勾选了 “在父工程中载入” 选项,现在我们先在提交界面,右键 --> 更新子模块:

 

由于父工程对子模块的引用并未更改(提交),所以此处更新子模块后,将会将子模块的提交索引复位(重新指向上个版本):

 

这样父工程恢复如初:

 

子模块的当前版本也复位了:

 

不过这样操作只是通过父工程进行强行复位,可以看到上图中分支的下拉框已经变成 (no branch) 了,这是不好的。正常操作应该是对子模块进行复位,我们先重新切回 master 分支:

 

然后使用 “复位当前分支到此处” 功能:

 

这次使用 “硬模式”,当作什么都没有发生过:

 

情况如下:

 

这种情况就像是,公共库在别的地方有了新版本,而我这个项目目前在用旧版本,现在可以选择保持使用旧版本,也可以选择更新到新版本。

 

选择旧版本的话,就是 “更新子模块” 或者什么都不操作(因为克隆的时候已经更新过了):

 

选择新版本的话,就是对子模块进行拉取操作:

 

然后父工程界面就会出现熟悉的标志:

 

当然,实际上你可以选择任何版本。其它的就大家自己探索吧。

 

五、[附] 去除最近的提交记录

大家也看到了,这次我为了写这篇文章,在项目中提交推送了一条无用的信息:

 

那么有没有方法去除呢?实际上之前也有过一篇文章《Git 图形化操作之合并提交记录》,不过那个是合并,最终还是有一条记录的,这次是要删除。概括说来,方法就是 复位 强制推送 。

 

首先是复位(复位当前分支到此处):

 

然后是强制推送(这里使用 强制租用 就行了):

 

然后就行了:

 

Gitee 上也是正常的:

 

好了,全文完,祝大家生活愉快。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系列-Red Hat5平台下的Postfix邮件服务搭建(二)

咱们接着上次的说,本次没有小标题。想了半天也没想出个好名子来,因为这次我们要做三件事:1.搭建基于Postfix的webmail;2.设置用户别名和邮件群组;3.设置邮件大小、邮箱空间的限制。环境还是之前的,做之前可…

单片机断电后静态存储区里面还有数据吗_单片机启动流程和存储架构详解

最近在给公司的ADAS DCU做内存分配(Memory Allocation),在这儿记录一下相关知识点,也算是给中文社区做贡献了。目录:1. ECU启动流程2. 存储空间解析3. TC397单片机的Memory Map和一些备注1. ECU启动流程图总比文字直观…

培养有见识的孩子,这6部适合孩子的纪录片,在家也能涨知识!

全世界只有3.14 % 的人关注了爆炸吧知识对孩子来说,好的纪录片就像打开了一扇新世界的大门,让他们了解更多世界的奇妙之处。BBC(英国广播公司)的纪录片题材广泛、制作精良。看这些经典的纪录片,既可以追溯上下数千年的…

Beta版本发布报告

项目名称学霸系统写手机客户端项目版本Beta版本负责人北京航空航天大学计算机学院 hots团队联系方式http://www.cnblogs.com/hotsbuaa/要求发布日期2014-12-28第一阶段基本功能已经完成,因此第二阶段的任务是:美化UI,修复接口,修复…

Dapr牵手.NET学习笔记:开篇

dapr,一个为分布式应用程序的运行时,为开发者在对接分布式组件时,提供了便利。使用dapr带来的好处可扩展性,因为它是通过sidecar的理概念来集成其他运行时的。同时dapr还提供了多种语言的SDK。关于dapr更多介绍,官方文…

vue 一个页面有点请求需要同时发送_前端性能优化,这些你都需要知道

来源: 海洋里的魔鬼鱼前言最近花了一些时间在项目的性能优化上,背后做了很多工作,但是最后依然没有达到自己想要的结果,有些失望,但是还是记录下自己的执着。性能优化总结:减少请求次数、减小资源大小、提高响应和加载…

男人能有什么错呢?

1 这上菜方式厉害了!2 谁上学的时候还没转过笔了!3 和朋友的塑料友情 图自别叫我P图仔4 非洲最致命的猫!传说能撂倒长颈鹿!大家估量一下!5 狗子:你放开我好吗??6 这位小姐姐真的很酷…

H3C 5510 交换机DHCP设置

DHCP不能发现网络上非DHCP客户机已经在使用的IP地址;当网络上存在多个DHCP服务器时,一个DHCP服务器不能查出已被其它服务器租出去的IP地址;DHCP服务器不能跨路由器与客户机通信,除非路由器允许BOOTP转发。PC发出的广播包&#xff…

opentrace在mysql中使用_采用OpenReplicator解析MySQL binlog

Open Replicator是一个用Java编写的MySQL binlog分析程序。Open Replicator 首先连接到MySQL(就像一个普通的MySQL Slave一样),然后接收和分析binlog,最终将分析得出的binlog events以回调的方式通知应用。Open Replicator可以被应用到MySQL数据变化的实…

雷军:有人说我写的代码像诗一样优雅~

全世界只有3.14 % 的人关注了爆炸吧知识整合整理:程序员的那些事(id:iProgrammer)雷军的代码像诗一样优雅↓↓↓有些网友在评论中质疑,说雷军代码不会是「屎」一样优雅吧。说这话的网友,也许是开玩笑的&…

mysql分析日志_MYSQL 索引(三)--- SQL日志分析

慢查询日志Mysql 的慢查询日志是 Myql 提供的一种日志记录,用来记录在 Myql 中响应时间查过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL,则会被记录在日志中。long_query_time 默认为 10,单位为秒。默认情况下&#…

C#多线程开发-任务并行库

你好,我是阿辉。正文共2090字,预计阅读时间:6min。之前学习了线程池,知道了它有很多好处。使用线程池可以使我们在减少并行度花销时节省操作系统资源。可认为线程池是一个抽象层,其向程序员隐藏了使用线程的细节&#…

为什么数学不好,和语文有关系?

▲ 点击查看苏步青教授在担任复旦大学校长时曾经说过:“如果允许复旦大学单独招生考试,我的意见是第一堂课就考语文,考后就批卷子。不合格的,以下的功课就不要考了。语文你都不行,别的是学不通的。”苏步青作为享誉世界的数学家&a…

python string length_如何使用python获取字符串长度?哪些方法?

掌握多种python技巧,对于我们更好的灵活应用python是非常重要的,比如接下来给大家介绍的获取字节长度,那大家脑海里就该有印象了,有几种方法呢?一起来看下吧~1、使用len()函数这是最直接的方法。 在这里,我…

python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法

大家知道,PyCharm是一款著名的Python IDE开发工具,是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,具备基本的调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。该IDE分为社区免费版(…

python中线程和进程_python中线程和进程的简单了解

一、操作系统、应用程序1.硬件:硬盘、cpu、主板、显卡........2.装系统(本身也是一个软件):系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合。3.安装软件:各种应用程序二、并发和…

一份干货满满的PPT,答辩加分手到擒来!

全世界只有3.14 % 的人关注了爆炸吧知识对很多童鞋来说,PPT可以说是使用频率很高的办公软件了。毕业答辩需要PPT,项目总结需要PPT,演讲也都需要PPT……可你是否因为PPT陷入这样的——脑壳疼状态!花费大量时间,结果PPT效…

Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行。当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for desktop中启用就可以了。但是我发现,启用了k8s后,Docker for desktop会消耗大量的系统资源…

记一次 .NET 某新能源汽车锂电池检测程序 UI挂死分析

一:背景 1. 讲故事这世间事说来也奇怪,近两个月有三位朋友找到我,让我帮忙分析下他的程序hangon现象,这三个dump分别涉及:医疗,新能源,POS系统。截图如下:那这篇为什么要拿其中的 新…

这个女生躲在衣柜等男友回家,结果竟是......

1 不要什么都怪爸爸我妈明明也是这样帮我脱的▼2 这就是现实版大女主反杀女二的故事啊▼3 我猜到了开头却没有猜到结尾▼4 ???一定是我被饿出了幻觉▼5 小小的孩子在极短的时间内经历了人生的大戏和大悲▼6 这个令人羡慕的发量啊&#…