【git】Git Submodule 命令与理解
创始人
2024-06-02 04:55:17
0次

【git】Git Submodule 命令与理解

TL;DR

# Add submodule
git submodule add
​
# Clone a project with submodules
git clone --recursive
​
# Update when submodeule remote repo changed
git submodule update --remote
​
# When cloned without recursive
git submodule init
git submodule update
​
# Push submodule change to its remote origin master
cd 
git add -A .
git commit -m "xxx"
git checkout 
git merge master
git push -u origin master

定义

git submodule允许用户将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立性。

作用

在我这里,它的作用非常明确,即给在各个项目中都会用到的代码段一个公共栖息地,做到“一处改,处处改”。

常用命令

添加

git submodule add
# 直接clone,会在当前目录生成一个someSubmodule目录存放仓库内容
git submodule add https://github.com/miracleyoo/someSubmodule
​
# 指定文件目录
git submodule add https://github.com/miracleyoo/someSubmodule  src/submodulePath

添加完之后,子模块目录还是空的(似乎新版不会了),此时需要执行:

git submodule update --init --recursive

来真正将子模块中的内容clone下来。同时,如果你的主目录在其他机器也有了一份clone,它们也需要执行上面的命令来把远端关于子模块的更改实际应用。

Clone时子模块初始化

clone父仓库的时候加上--recursive,会自动初始化并更新仓库中的每一个子模块

git clone --recursive

或:

如果已经正常的clone了,那也可以做以下补救:

git submodule init
git submodule update

正常clone包含子模块的函数之后,由于.submodule文件的存在someSubmodule已经自动生成,但是里面是空的。上面的两条命令分别:

  1. 初始化的本地配置文件
  2. 从该项目中抓取所有数据并检出到主项目中。

更新

git submodule update --remote

Git 将会进入所有子模块,分别抓取并更新,默认更新master分支。

不带--remote的update只会在本地没有子模块或它是空的的时候才会有效果。

推送子模块修改

这里有一个概念,就是主repo中的子模块被拉到本地时默认是一个子模块远程仓库master分支的detached branch。这个分支是master的拷贝,但它不会被推送到远端。如果在子模块中做了修改,并且已经add,commit,那你会发现当你想要push的时候会报错:Updates were rejected because a pushed branch tip is behind its remote。这便是所谓的detached branch的最直接的体现。

解决方法是:在子模块中先git checkout master,然后在git merge ,最后git push -u origin master即可。

这里解释一下这个东西可以使用git branch命令查看。如果你使用的是zsh,那么问题就更简单了,直接在命令提示符处就可以找到。

在这里插入图片描述
在这里插入图片描述

参考

  1. 来说说坑爹的 git submodule
  2. Git submodule使用指南(一)
  3. Working with submodules
  4. Why is my Git Submodule HEAD detached from master?

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...