Git常用命令submodule

Git常用命令submodule

1、需求

当程序比较大参与开发人员较多时,代码管理就复杂起来。代码如果全员可见,可以创建 share 分支维护共用代

码,可以创建 core 分支维护核心算法代码,各进程分别占一个分支,定期同步 share 和 core 分支。代码如果不

能全员可见,可以仓库中包含子仓库,子仓库管理模块代码,主仓库定时更新。

同时有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。也许是第三方库,或者你独立开发

的,用于多个父项目的库。现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一

个。如果将另外一个项目中的代码复制到自己的项目中,那么你做的任何自定义修改都会使合并上游的改动变得困

难。Git 通过子模块来解决这个问题,允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。它能让你将另一个仓

库克隆到自己的项目中,同时还保持提交的独立。

2、常用命令

# 添加子模块
# 在主项目中添加子项目,URL为子模块的路径,path为该子模块存储的目录路径
git submodule add [repository_url] [path]# 克隆含有子项目的主项目
git clone [repository_url]# 递归的方式克隆整个项目
git clone <repository> --recursive 
# 当你在克隆这样的项目时,默认会包含该子项目的目录,但该目录中还没有任何文件# 初始化本地配置文件
# 初始化子模块
git submodule init# 从当前项目中抓取所有数据并检出父项目中列出的合适的提交
# 更新子模块
git submodule update# 等价于git submodule init && git submodule update
git submodule update --init# 自动初始化并更新仓库中的每一个子模块,包括可能存在的嵌套子模块
git clone --recurse-submodules [url]# 拉取所有子模块
git submodule foreach git pull 

3、使用

3.1 创建带子模块的版本库

例如我们要创建如下结构的项目:

project|--moduleA|--readme.txt
$ mkdir submoduletest$ cd submoduletest/

创建 project 版本库,并提交 readme.txt 文件:

$ git init --bare project.git
Initialized empty Git repository in C:/Users/zhangshixing/Desktop/submoduletest/project.git/$ git clone project.git project1
Cloning into 'project1'...
warning: You appear to have cloned an empty repository.
done.$ cd project1$ echo "This is a project." > readme.txt$ git add .$ git commit -m "add readme.txt"
[master (root-commit) 50a6933] add readme.txt1 file changed, 1 insertion(+)create mode 100644 readme.txt$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 229 bytes | 229.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git* [new branch]      master -> master$ cd ..

创建 moduleA 版本库,并提交 a.txt 文件:

$ git init --bare moduleA.git
Initialized empty Git repository in C:/Users/zhangshixing/Desktop/submoduletest/moduleA.git/$ git clone moduleA.git moduleA1
Cloning into 'moduleA1'...
warning: You appear to have cloned an empty repository.
done.$ cd moduleA1$ echo "This is a submodule." > a.txt$ git add .$ git commit -m "add a.txt"
[master (root-commit) d0f22fb] add a.txt1 file changed, 1 insertion(+)create mode 100644 a.txt$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 224 bytes | 224.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/moduleA.git* [new branch]      master -> master$ cd ..

project 项目中引入子模块 moduleA ,并提交子模块信息:

$ cd project1$ git submodule add ../moduleA.git moduleA
Cloning into 'C:/Users/zhangshixing/Desktop/submoduletest/project1/moduleA'...
done.$ ls
moduleA/  readme.txt$ git status
On branch master
Your branch is up-to-date with 'origin/master'.Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   .gitmodulesnew file:   moduleA$ git diff$ git add .$ git commit -m "add submodule"
[master 60d9847] add submodule2 files changed, 4 insertions(+)create mode 100644 .gitmodulescreate mode 160000 moduleA$ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 352 bytes | 352.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git50a6933..60d9847  master -> master$ cd ..

使用 git status 可以看到多了两个需要提交的文件,其中 .gitmodules 指定submodule的主要信息,包括子

模块的路径和地址信息,moduleA 指定了子模块的commit id,使用git diff可以看到这两项的内容。这里需要

指出父项目的 git 并不会记录 submodule 的文件变动,它是按照 commit id 指定 submodule 的 git header,所

.gitmodulesmoduleA 这两项是需要提交到父项目的远程仓库的。

3.2 克隆带子模块的版本库

方法一,先 clone 父项目,再初始化 submodule,最后更新 submodule,初始化只需要做一次,之后每次只需

要直接 update 就可以了,需要注意 submodule 默认是不在任何分支上的,它指向父项目存储的 submodule

commit id。

$ git clone project.git project2
Cloning into 'project2'...
done.$ cd project2$ ls
moduleA/  readme.txt$ ls moduleA/
# 没有内容$ git submodule init
Submodule 'moduleA' (C:/Users/zhangshixing/Desktop/submoduletest/moduleA.git) registered for path 'moduleA'$ ls moduleA/
# 没有内容$ git submodule update
Cloning into 'C:/Users/zhangshixing/Desktop/submoduletest/project2/moduleA'...
done.
Submodule path 'moduleA': checked out 'd0f22fbfd4336480863ed232ec785c0e507cf944'$ ls moduleA/
a.txt$ cd ..

方法二,采用递归参数 --recursive,需要注意同样 submodule 默认是不在任何分支上的,它指向父项目存储

的 submodule commit id。

$ git clone project.git project3 --recursive
Cloning into 'project3'...
done.
Submodule 'moduleA' (C:/Users/zhangshixing/Desktop/submoduletest/moduleA.git) registered for path 'moduleA'
Cloning into 'C:/Users/zhangshixing/Desktop/submoduletest/project3/moduleA'...
done.
Submodule path 'moduleA': checked out 'd0f22fbfd4336480863ed232ec785c0e507cf944'$ cd project3/$ ls
moduleA/  readme.txt$ ls moduleA/
a.txt

3.3 修改子模块

修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响,如果父项目需要用到最新的

子模块代码,我们需要更新父项目中 submodule commit id,默认的我们使用 git status 就可以看到父项目中

submodule commit id 已经改变了,我们只需要再次提交就可以了。

$ cd project1/moduleA$ git branch
* master$ echo "This is a submodule." > b.txt$ git add .$ git commit -m "add b.txt"
[master e9b6471] add b.txt1 file changed, 1 insertion(+)create mode 100644 b.txt$ git push origin master
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 230 bytes | 230.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/moduleA.gitd0f22fb..e9b6471  master -> master$ cd ..$ git status
On branch master
Your branch is up-to-date with 'origin/master'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   moduleA (new commits)no changes added to commit (use "git add" and/or "git commit -a")$ git diff
diff --git a/moduleA b/moduleA
index d0f22fb..e9b6471 160000
--- a/moduleA
+++ b/moduleA
@@ -1 +1 @@
-Subproject commit d0f22fbfd4336480863ed232ec785c0e507cf944
+Subproject commit e9b647157369276e6e70fc148fc176676eab4476$ git add .$ git commit -m "update submodule add b.txt"
[master 312c8e0] update submodule add b.txt1 file changed, 1 insertion(+), 1 deletion(-)$ git push origin master
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 308 bytes | 308.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git60d9847..312c8e0  master -> master$ cd ..

3.4 更新子模块

更新子模块的时候要注意子模块的分支默认不是 master。

方法一,先pull父项目,然后执行 git submodule update,注意 moduleA 的分支始终不是master。

$ cd project2$ git pull
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From C:/Users/zhangshixing/Desktop/submoduletest/project60d9847..312c8e0  master     -> origin/master
Fetching submodule moduleA
From C:/Users/zhangshixing/Desktop/submoduletest/moduleAd0f22fb..e9b6471  master     -> origin/master
Updating 60d9847..312c8e0
Fast-forwardmoduleA | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)$ git submodule update
Submodule path 'moduleA': checked out 'e9b647157369276e6e70fc148fc176676eab4476'$ cd ..

方法二,先进入子模块,然后切换到需要的分支,这里是 master 分支,然后对子模块 pull,这种方法会改变子模

块的分支。

$ cd project3/moduleA$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.$ cd ..$ git submodule foreach git pull
Entering 'moduleA'
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From C:/Users/zhangshixing/Desktop/submoduletest/moduleAd0f22fb..e9b6471  master     -> origin/master
Updating d0f22fb..e9b6471
Fast-forwardb.txt | 1 +1 file changed, 1 insertion(+)create mode 100644 b.txt$ git status
On branch master
Your branch is up-to-date with 'origin/master'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   moduleA (new commits)no changes added to commit (use "git add" and/or "git commit -a")$ git diff
diff --git a/moduleA b/moduleA
index d0f22fb..e9b6471 160000
--- a/moduleA
+++ b/moduleA
@@ -1 +1 @@
-Subproject commit d0f22fbfd4336480863ed232ec785c0e507cf944
+Subproject commit e9b647157369276e6e70fc148fc176676eab4476$ git add .$ git commit -m "update submodule add b.txt"
[master 50e7e55] update submodule add b.txt1 file changed, 1 insertion(+), 1 deletion(-)$ git push origin master | git push -f origin master
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 824 bytes | 824.00 KiB/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git+ 6e1a3d3...50e7e55 master -> master (forced update)$ cd ..

3.5 删除子模块

有时子模块的项目维护地址发生了变化,或者需要替换子模块,就需要删除原有的子模块。

网上有好多用的是下面这种方法:

$ cd project1/$ ls
moduleA/  readme.txt$ git rm --cached moduleA
rm 'moduleA'$ rm -rf moduleA$ rm .gitmodules$ vim .git/config

在这里插入图片描述

# 删除submodule相关的内容
[submodule "moduleA"]url = C:/Users/zhangshixing/Desktop/submoduletest/moduleA.gitactive = true

在这里插入图片描述

# 然后提交到远程服务器
$ git add .$ git commit -m "remove submodule"
[master 93e32f8] remove submodule2 files changed, 4 deletions(-)delete mode 100644 .gitmodulesdelete mode 160000 moduleA$ git push origin master
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (2/2), 234 bytes | 234.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git312c8e0..93e32f8  master -> master

但是我自己本地实验的时候,发现用下面的方式也可以,服务器记录的是 .gitmodulesmoduleA,本地只要

用 git 的删除命令删除 moduleA,再用 git status 查看状态就会发现 .gitmodules 和 moduleA 这两项都已经改变

了,至于 .git/config,仍会记录 submodule 信息,但是本地使用也没发现有什么影响,如果重新从服务器克隆

则 .git/config 中不会有submodule信息。

$ git rm moduleA
rm 'moduleA'$ git status
On branch master
Your branch is up-to-date with 'origin/master'.Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified:   .gitmodulesdeleted:    moduleA$ git commit -m "remove submodule"
[master 6e1a3d3] remove submodule2 files changed, 4 deletions(-)delete mode 160000 moduleA$ git push origin master | git push -f origin master
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (11/11), 1.05 KiB | 1.05 MiB/s, done.
Total 11 (delta 0), reused 0 (delta 0)
To C:/Users/zhangshixing/Desktop/submoduletest/project.git+ 93e32f8...6e1a3d3 master -> master (forced update)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vmware15下载与安装教程

VMware VMware是一款虚拟机软件&#xff0c;可以在同一台计算机上运行多个操作系统。VMware15是VMware公司推出的最新版本&#xff0c;具有更好的性能和稳定性&#xff0c;同时支持Windows、Mac以及Linux等多种操作系统。 以下是VMware15的下载安装教程&#xff1a; 下载VMw…

Win10—VMware15虚拟机安装教程

一、下载 下载地址VMware15&#xff08;32/64&#xff09;位下载地址&#xff0c;提取码: qvry 二、安装 解压缩如下&#xff1a; 双击exe运行 点击【下一步】 勾选【我接受条款协议中的条款】&#xff0c;然后点击【下一步】。 点击【更改】更改软件的安装目录&…

完全免费PNG素材库,免费可商用~

推荐的这几个PNG素材网一定要收藏~免费可商用~ 菜鸟图库 https://www.sucai999.com/searchlist/66008----all-0-1.html?vNTYxMjky 菜鸟图库是一个为新手设计师提供免费素材的网站&#xff0c;站内有非常多设计相关素材&#xff0c;比如平面模板、UI素材、电商素材、免抠素材…

VMware15虚拟机安装教程

​​​​​关注公众号&#xff0c;免费获取资料 简介&#xff1a; VMware&#xff08;威睿&#xff09; 是全球桌面到数据中心虚拟化解决方案的领导厂商。全球不同规模的客户依靠VMware来降低成本和运营费用、确保业务持续性、加强安全性并走向绿色。VMware使企业可以采用能够解…

【转】VMware15虚拟机安装教程

https://mp.weixin.qq.com/s/Rdj5AA7aVOzFDMnXeousWg &#xff08;源于软件安装管家公众号&#xff09; VMware15&#xff08;32/64&#xff09;位下载地址&#xff1a; pan.baidu.com/s/16_JlJ31R6wR8ja_f7o9kNw 提取码: 4c94 [Windows 10/64位下载链接]&#xff1…

VMware虚拟机安装win10系统教程(巨细)

VMware安装win10流程 第一章&#xff1a;创建新虚拟机 第二章&#xff1a;典型安装与自定义安装 ​ 典型安装与自定义安装的差别&#xff1a;通常设计人员使用自定义安装&#xff08;高级&#xff09;。 1. 典型安装&#xff1a; 这种安装方式将默认选项用于所有安装设置&…

七、进程地址空间

一、环境变量 &#xff08;一&#xff09;概念 环境变量(environment variables)&#xff1a;系统当中用做特殊用途的系统变量。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可…

bmp图片怎么转jpg格式?思路提供

BMP和JPG是两种常见的图片格式。BMP文件相对较大&#xff0c;无损压缩&#xff0c;而JPG文件则相对较小&#xff0c;有损压缩。当我们需要在保持图片质量的同时减小文件大小时&#xff0c;我们可以将BMP文件转换为JPG文件。在本文中&#xff0c;我们将介绍如何将BMP文件转换为J…

Kotlin Channel系列(一)之读懂Channel每一行源码

文章目录 有话说概述初识ChannelChannel种类Channel五大金刚SendReceiveClosedQueueBuffer Channel的行为Channel源码分析发送数据大动脉接收数据大动脉父类默认实现方式(RendezvousChannel)发送流程send()函数onSend()函数 接收流程receiveCatching()函数onReceiveCatching()函…

WPF TextBox限制只能输入数字的两种方法

文本框中只能输入数字&#xff0c;一个常见的功能喽&#xff0c;今天就来看看如何实现它~ 下面就看看代码 思路都写在xaml里面了&#xff0c; MainWindow.xaml: <Window x:Class"wpfcore.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pre…

centos安装etcd

方法1&#xff1a;默认安装&#xff08;不建议&#xff09; 运行命令 yum install etcd 即可&#xff0c;只是安装的etcd版本较低&#xff0c;一般是 etcd-3.3.11&#xff0c;如下图 手动开启etcd&#xff0c;可以看到etcd服务已经开启来了&#xff0c;如下图 特别注意&#x…

llama_index中query_engine的response_mode详解

文章目录 0. 前言1. ResponseMode: tree_summarize &#xff08;总结摘要-最优&#xff09;2. ResponseMode: generation3. ResponseMode: no_text4. ResponseMode: simple_summarize &#xff08;最省token&#xff09;5. ResponseMode: refine &#xff08;基于关键词询问-最…

遇见未来,降低职场焦虑——中国人民大学与加拿大女王大学金融硕士来助力

身在职场的你有感到一丝丝的焦虑吗&#xff1f;偶尔的小焦虑可以作为我们工作中的动力&#xff0c;时刻提醒我们保持奋进。预见未来才能遇见未来&#xff0c;随着社会经济不断发展&#xff0c;没有什么是一成不变的。处于职场上升期的我们更要懂得未雨绸缪&#xff0c;增加自身…

多种工厂模式的运用

文章目录 多种工厂模式的运用一、简单工厂模式&#xff08;非23种设计模式&#xff09;1.1 结构2.2 实现2.2.1 简单工厂类图2.2.2 代码2.2.3 优缺点 二、静态工厂模式&#xff08;非23种设计模式&#xff09;3.1 代码 三、工厂模式3.1 结构 3.2 实现3.2.1 工厂模式类图3.2.2 代…

EBU6304 Software Engineering 知识点总结_5 项目管理_上

Software architecture 功能需求和软件架构关系紧密&#xff0c;非功能需求是软件架构的选择结果&#xff08;好的架构运行效率高之类的&#xff09;。可以以表格或图的形式&#xff0c;比如UML图。 设计难以更改。敏捷开发的早期阶段就是设计系统架构。 好处&#xff1a; …

OGL(教程16)——基础贴图映射

原文地址&#xff1a;http://ogldev.atspace.co.uk/www/tutorial16/tutorial16.html 背景知识&#xff1a; 贴图的映射的意思是应用任何类型的图到3D模型的多个面上。这个图叫做纹理&#xff0c;它可以是任何东西。如砖头、树叶、贫瘠的土地&#xff0c;使用这些贴图增加场景的…

【UE4】官方课程笔记

【UE4】官方课程笔记 Blueprint Project Config project-specific settings Content content folder Intermidiate 可删除&#xff0c;暂时性文件 Saved 一旦删除不可恢复的文件 DDC DRIVE DATA CACHE C Project .sln文件 可删除&#xff0c;再次打开时recreated Sourc…

shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成

shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is easy and intuitive for both technical artists and graphics engineers. This approach overcomes several limitations of traditional methods.

OpenGL学习笔记(四)-光照-材质-光照贴图

参考网址&#xff1a;LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色&#xff0c;是它所反射的颜色。如将白光照在红色的玩具上&#xff0c;玩具会吸收白光中除了红色以外的所有子颜色&#xff0c;不被吸收的红色光被反射到我们的…

三维建模贴图技巧

作者&#xff1a;关宇 #一、概述 整个三维项目中建模制作为核心环节&#xff0c;决定了整个项目的框架基础。在制作的时候参考数据尤为重要决定了模型的精度。 一个完整的三维模型包括白模和贴图&#xff0c;白模决定了模型的外形结构&#xff0c;而贴图赋予色彩和细节。 个人…