通过 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启动流程图总比文字直观…

[WCF安全系列]认证与凭证:用户名/密码认证与Windows认证

如果要给认证下一个定义,我个人的倾向这样的定义:认证是确定被认证方的真实身份和他或她申明(Claim)的身份是否相符的行为。认证方需要被认证方提供相应的身份证明材料,以鉴定本身的身份是否与声称的身份相符。在计算机…

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

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

Beta版本发布报告

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

mysql连接主备_mysql主备配置方法

1. 选择两台机器(这里选的centos6.5 final),安装相同版本的mysqlyum installmysql ;yum install mysql-server;2. 启动mysqlservice mysqld start3. 登录两个mysql,执行如下命令GRANT REPLICATION SLAVE,REPLICATION CLIENT on *.* to replmysql机器IP i…

linux下tar解压特定的目录

今天碰到一个客户的网站出问题,需要恢复;可我备份都是用打包的,如果要恢复某个目录,就需要全部解压,才能恢复;这样很费事。所以我请教了很多牛人,有没有解压压缩包里面特定的目录,可…

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

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

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

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

男人能有什么错呢?

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

LDAP启动cacao提示Invalid file permission

问题处理步骤: 1、LDAP实例停止 2、DSCC控制台启动,提示cacao已停止…… 3、启动caocaorootrusky bin]# ./cacaoadm startInvalid file permission: [/home/ldap/dsee6/cacao_2/etc/opt/sun/cacao/instances/default/security] [rwxrwxr-x]. Problem val…

[019] C#基础:理解装箱与拆箱

.NET大牛之路 • 王亮精致码农 • 2021.08.27前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型。值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用被 GC 回收。但有时候你可能偶尔需要将一种类型…

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)雷军的代码像诗一样优雅↓↓↓有些网友在评论中质疑,说雷军代码不会是「屎」一样优雅吧。说这话的网友,也许是开玩笑的&…

国外网站评出对程序员最具影响的书籍清单

国外知名网站 stackoverflow 上有一个问题调查: 哪本书是对程序员最有影响、每个程序员都该阅读的书?这个调查已历时两年,目前为止吸引了153,432 人访问,读者共推荐出了 478 本书(还在增加),其中最火的一本书《Code Co…

python大于小于_在Python中大于/小于Pandas DataFrames / Series之间的比较

如何在DataFrame和Series之间进行比较?我想掩盖DataFrame / Series中比其他DataFrame / Series中的元素更大/更小的元素. 例如,以下内容不会替换大于均值的元素 与nans虽然我期待它: >>> x pd.DataFrame(data{a: [1, 2], b: [3, 4]}) >>…

NodeJS学习笔记

通过js创建个简单的web服务器 var httprequire(http); http.createServer(function(req,res){ res.writeHead(200,{Content-Type:text/html}); res.end("server is up!"); }).listen(8000); console.log(listened on 8000); 推荐学习:Node入门 转载于:https://www.cn…

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

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

【转】SMIL基础教程(1)

最近公司项目需要使用到smil相关知识,因而专门学习了一下。在网上找到了几篇基础教程,转载以方便查看。一、 简介随着流技术的成熟和广泛的应用,其优点我们有了深深的体会。但是,其不足之处也逐渐体现出来。问题的出现&#xff0c…