首页 > 其他分享 >git submodule

git submodule

时间:2024-08-09 12:06:11浏览次数:8  
标签:git -- add submodule 模块 moduleA

1.先来个官方的API

git submodule [--quiet] add [<options>] [--] <repository> [<path>]
git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…​]
git submodule [--quiet] init [--] [<path>…​]
git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…​)
git submodule [--quiet] update [<options>] [--] [<path>…​]
git submodule [--quiet] summary [<options>] [--] [<path>…​]
git submodule [--quiet] foreach [--recursive] <command>
git submodule [--quiet] sync [--recursive] [--] [<path>…​]
git submodule [--quiet] absorbgitdirs [--] [<path>…​]

看完后其实也差不多明白了,比其他git命令多了个 submodule 关键字,先不看submodule命令,有submodule的仓库在当前目录会有个**.gitmodules**文件。记录path和url,如下。这里表明你引用的多少个子模块

[submodule "test"]
	path = test
	url = http://github.com/demo/test.git

还有一处改动在 vi .git/config查看,如下



[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        autocrlf=false
[remote "origin"]
        url = url....
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[submodule "ssl"]
        active = true
        url = url....

  

上面的所有的命令基本都基于此处两个文件的配置来生效的。

2.解析git命令

常用命令如下

git clone <repository> --recursive  //递归的方式克隆整个项目
git submodule add <repository> <path> //添加子模块
git submodule init //初始化子模块
git submodule update //更新子模块
git submodule foreach git pull  //拉取所有子模块

  

2.1创建带子模块的版本库

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

project
  |--moduleA
  |--readme.txt

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

git init --bare project.git
git clone project.git 
cd project1
echo "This is a project." > readme.txt
git add *
git commit -m "add readme.txt"
git push origin master
cd ..

 

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

git init --bare moduleA.git
git clone moduleA.git 
cd moduleA1
echo "This is a submodule." > a.txt
git add *
git commit -m "add a.txt"
git push origin master

  

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

cd project1
git submodule add ../moduleA.git moduleA
git status
git diff
git add*
git commit -m "add submodule"
git push origin master

  

使用git status可以看到多了两个需要提交的文件,其中.gitmodules指定submodule的主要信息,包括子模块的路径和地址信息,moduleA指定了子模块的commit id,使用git diff可以看到这两项的内容。这里需要指出父项目的git并不会记录submodule的文件变动,它是按照commit id指定submodule的git header,所以.gitmodules和moduleA这两项是需要提交到父项目的远程仓库的。

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:   .gitmodules
    new file:   moduleA

  

###2.2 克隆带子模块的版本库
方法一,先clone父项目,再初始化submodule,最后更新submodule,初始化只需要做一次,之后每次只需要直接update就可以了,需要注意submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。

git clone project.git project2
cd project2
git submodule init
git submodule update

  

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

git clone project.git project3 --recursive

2.3修改子模块

修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响,如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。

cd project1/moduleA
git branch
echo "This is a submodule." > b.txt
git add *
git commit -m "add b.txt"
git push origin master
cd ..
git status
git diff
git add *
git commit -m "update submodule add b.txt"
git push origin master

  

2.4更新子模块

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

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

cd project2
git pull
git submodule update

  

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

cd project3/moduleA
git checkout master
cd ..
git submodule foreach git pull

  

  1. 删除子模块
    网上有好多用的是下面这种方法
git rm --cached moduleA
rm -rf moduleA
rm .gitmodules
vim .git/config

  

删除submodule相关的内容,例如下面的内容

[submodule "moduleA"]
      url = /Users/nick/dev/nick-doc/testGitSubmodule/moduleA.git

  

然后提交到远程服务器

git add .
git commit -m "remove submodule"

  

但是我自己本地实验的时候,发现用下面的方式也可以,服务器记录的是.gitmodules和moduleA,本地只要用git的删除命令删除moduleA,再用git status查看状态就会发现.gitmodules和moduleA这两项都已经改变了,至于.git/config,仍会记录submodule信息,但是本地使用也没发现有什么影响,如果重新从服务器克隆则.git/config中不会有submodule信息。

git rm moduleA
git status
git commit -m "remove submodule"
git push origin master

  

3.问题

这里写图片描述
git submodule update出现此问题,是因为终端用的不是windows自带的cmd,用自带的cmd打开执行此命令即可

 

 

===========

/新建文件夹demo1
mkdir demo1
//进入将要创建的仓库
cd demo1
//初始化仓库
git init 

  

添加子仓库

git submodule add url

  

把url替换成你想添加的子仓库;执行成功后,可以在demo1文件夹下看到.gitsubmodule文件

 

推送到远程仓库

在推送到远程仓库前,我们还要给本地仓库添加一个远程仓库地址,可以到git.oschina 或github上创建

//添加远程仓库地址
git remote add origin https://....git //origin 是该远程仓库在本地的别名,可自定义。
//添加所有文件到缓存
git add .
//提交到本地仓库
git commit -m "first commit"
//推送到远程仓库
git push origin master //master是分支名称

  

子仓库的常用操作。

//回到demo1的上级目录
cd ..
//克隆仓库到demo2
git clone https://....git demo2  //demo2为指定的文件夹,也可以不指定。

  

克隆带子仓库的仓库

克隆主仓库后,子仓库是没有代码的,所以继续

初始化子仓库

git submodule init 

 

克隆子仓库代码。

git submodule update

 

标签:git,--,add,submodule,模块,moduleA
From: https://www.cnblogs.com/ygunoil/p/18350544

相关文章

  • Centos上Jenkins+git+allure使用教程
    1、Jenkins上下载allure 2、下载安装完成后重启Jenkins,然后查看allure插件安装成功,如下图所示 3、Jenkins服务器上,安装allure-2.26.0,安装完成后配置环境变量,vi/etc/profile配置环境变量添加exportPATH=$PATH:/usr/local/allure-2.26.0/bin保存环境变量source/etc......
  • GitHub每日最火火火项目(8.7)
    项目名称:bghira/SimpleTuner项目介绍:SimpleTuner是一个面向StableDiffusion2.1、StableDiffusion3、DeepFloyd和SDXL的通用微调工具包。它旨在为这些模型提供一种便捷的方式进行微调,以适应不同的应用场景和需求。通过使用SimpleTuner,用户可以调整模型的参数,从而提高......
  • GitHub每日最火火火项目(8.8)
    项目名称:bghira/SimpleTuner项目介绍:SimpleTuner是一个通用的微调工具包,主要面向StableDiffusion2.1、StableDiffusion3、DeepFloyd和SDXL等模型。它为这些模型的微调提供了便利,使用户能够更轻松地调整模型的参数,以满足不同的应用需求。通过SimpleTuner,用户可以更好......
  • git常用场景
    相信Git操作是每一位程序员都应该学习的基本技能。然而,直接学习Git命令可能会感到枯燥无味,尤其是在刚接触时。为了帮助大家更好地理解和应用Git,我想结合我在实习开发中的一些实际经验,介绍几个常见的开发场景以及相应的Git操作。我刚才提交了什么?如果你用gitcommit-a提交了一......
  • git的快速入门(含常用指令)
    目录概念什么是gitgit与GitHub有什么区别提交、仓库、分支git的使用从GitHub上下载别人的代码直接将代码下载到本地克隆仓库获取代码将自己的代码上传到GitHub本文拟将用通俗的语言描述git的使用方法,如有出入,请批评指正概念什么是gitGit可以想象成一个超级高效的"时间机器",专......
  • git前端上传项目忽略本地node_modules文件
    要在Git上传前端代码时忽略node_modules文件夹在项目根目录下查找或创建.gitignore文件:如果你的项目中已经存在.gitignore文件,则打开它进行编辑。如果不存在,就在项目根目录下创建一个新的.gitignore文件。在.gitignore文件中添加node_modules/:打开.gitignore文件,并添加......
  • Git合并之————指定提交记录合并
    应用场景在测试环境提交了多个功能代码,其中一个功能需要提前上线如图所示,红框部分为我本次需要上线的功能提交记录代码,绿框部分为我已选择上线成功,可以看到红框与绿框直接的内容并没有被带入master分支.这里我以IDEA为例.首先,切换到master分支,也就是你需要......
  • git突然无法推送到远程仓库
     gitmaster合并了开发分支后,通过gitstatus显示Yourbranchisaheadof'origin/master'by4commits.,但是无法push,会提示报错 error:failedtopushsomerefsto"项目地址"1.检查远程分支更新 首先,确保远程分支是最新的。运行以下命令以获取远程仓库的最新更......
  • GIT常用命令
     gitbranch查看本地所有分支gitstatus查看当前状态gitcommit提交gitbranch-a查看所有的分支gitbranch-r查看本地所有分支gitcommit-am"init"提交并且加注释gitremoteaddorigin地址gitpushoriginmaster将文件给推到服务器上gitremoteshow......
  • 修改.gitignore里面曾经追踪过的文件变成不追踪
    .gitignore 只能忽略那些原来没有被追踪(tracked)的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的解决方法就是,先把本地缓存删除(改成未track状态),然后再提交:gitrm-r--cached.gitadd.gitcommit-m'update.gitignore'gitpush 具体步骤如下......