git submodule子模块的使用

子模块的使用

添加子模块

  1. 添加子模块

    git submodule add <子仓库URL> <子仓库路径>

    例子: git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco

  2. 若子模块存在好几个分支,可以在添加子模块时,指定分支

    git submodule add -b <分支名> <子仓库URL> <子仓库路径>

    例子:git submodule add -b build_V1.9.4_ar9341 http://192.168.100.181/guideir/poco.git 3rdparty/poco

    执行此命令后可以在 .gitmodules 文件中看到如下配置:

    [submodule "poco"]
    	path = 3rdparty/poco
    	url = http://192.168.100.181/guideir/poco.git
    	branch = build_V1.9.4_ar9341
    

下载子模块

使用 git clone 下载代码时,如果使用普通的 git clone来克隆项目,会发现项目的子模块文件夹中内容为空

可以使用以下两种方式来克隆子项目:

  1. 克隆主项目时候,使用 git clone --recurse-submodules <主仓库URL> 递归克隆子模块

    例子:git clone --recurse-submodule https://gitee.com/oweni/config-test.git

    git clone --recurse-submodule是 Git 2.13 版本引入的,为了提高命令的可读性。在之前的版本中,可以使用git clone --recursive`指令,无论是哪种写法,都会递归地克隆主仓库及其所有子模块

  2. 若已经克隆完成主项目,但是此时子模块文件夹为空,可以在主仓库目录中使用 git submodule update --init指令下载子模块

    例子:

    1. 下载主仓库代码: git clone https://gitee.com/oweni/config-test.git
    2. 在主仓库目录使用: git submodule update --init 或者 git submodule update --init --recursive 递归下载子模块
  3. 若已经下载完成子模块,发现子模块不是最新代码,可以在主仓库目录使用: git submodule update --remote 或者 git submodule update --remote --recursive 指令将子模块更新到子模块的最新节点;

    注意git submodule update 是将子仓更新到主仓库当前引用的节点,注意,主仓库当前引用的节点,并不一定是子仓库的最新节点;而git submodule update --remote是将子仓库更新到子仓库的最新节点,所以通常在执行完git submodule update --remote指令后,也许主仓库会提示子仓库有新提交,此时在父仓库中add + commit + push当前改动,将主仓库引用的子仓库节点更新到最新

修改子模块代

1.正常情况,进入子仓库,使用git status 查看当前是否处于某个分支,如果是处于正常的分支,那么可以直接进行添加和提交,和普通的提交流程一样

$ git add .
$ git commit -m "commit"
$ git push origin master

2.异常情况,如果进入子仓库,发现子仓库的状态为 头指针分离于 XXXX(commit id),此时有两种解决方案提交:

方案一

1.使用 git addgit commit来添加和提交修改到本地

git add <change files>
git commit -m "fix some bugs"

2.推送修改到子仓库的远端,在头指针分离的情况下,如下提交:

git push origin HEAD:master
//推送当前修改到远端的master分支上

3.回到父仓库中,提交对子模块的更新

cd ..	//回到上级目录(父仓库)
git add son  //son为子仓库的目录
git commit -m "update son submodule"
git push origin master
方案二

解决方法是:在子模块中先git checkout master,然后在git merge <detached branch name/number>,最后git push -u origin master即可。如图:
在这里插入图片描述

解释下出现 头指针分离的原因:

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

删除子模块

使用git submodule deint指令来删除子模块

提供一个例子,删除trunk/3rdparty/ffmpeg子模块,之后再引入trunk/3rdparty/ffmpeg子模块

1.git submodule deinit -f trunk/3rdparty/ffmpeg,删除 trunk/3rdparty/ffmpeg子模块

​ 此时本地代码目录trunk/3rdparty/ffmpeg中的代码会被删除,但是此文件夹会存留

2.手动删除.git/modules/目录中相关子模块的文件夹

rm -rf .git/modules/trunk/3rdparty/ffmpeg/

3.执行git rm trunk/3rdparty/ffmpeg, 删除此子模块在git中的记录,

此操作会删除以下两个内容:

  • .gitmodule文件中关于这个子模块的配置
[submodule "trunk/3rdparty/ffmpeg"]
	path = trunk/3rdparty/ffmpeg
	url = ssh://git@192.168.100.181:2222/guideir/ffmpeg.git
	branch = build_V4.2.1_ar9341
  • 本地代码目录trunk/3rdparty/ffmpeg目录

执行完以上三个步骤,则子模块被完全清除干净,接下来再添加子模块

4.添加子模块

git submodule add -b build_V4.2.1_ar9341 ssh://git@192.168.100.181:2222/guideir/ffmpeg.git trunk/3rdparty/ffmpeg

注意事项:

  • 如果没有执行删除操作中的第2步,则添加子模块时会报错:在这里插入图片描述
  • 如果没有执行删除操作中的第3步,则添加子模块时会报错在这里插入图片描述
    git pro
Git submoduleGit 的一个功能,可以将一个 Git 仓库作为另一个 Git 仓库的目录进行管理。通过使用模块,我们可以在一个 Git 仓库中使用另一个 Git 仓库的组件。 使用 git submodule 的步骤如下: 1. 在父项目中添加模块使用命令 `git submodule add <模块仓库地址> <模块存放路径>` 将模块添加到父项目中。 2. 克隆模块使用命令 `git submodule init` 初始化模块,然后使用命令 `git submodule update` 克隆模块的内容。 3. 切换到模块分支:通过 `cd <模块路径>` 进入模块目录,然后使用 `git checkout <分支名>` 切换到模块所在的特定分支。 4. 更新模块:在父项目中使用命令 `git submodule update --remote` 可以更新模块为最新的提交。 5. 提交模块修改:在父项目中修改了模块后,需要切换到模块目录,进行提交和推送操作。 使用模块的好处是可以将项目作为独立的仓库进行开发和维护,同时在父项目中方便地使用和更新模块使用模块可以实现项目的模块化和复用,提高代码的可维护性和可重用性。 需要注意的是,使用模块时需要注意模块的分支和版本控制,因为模块可能会更新,需要及时更新父项目中的模块。同时,在多人协作开发中,也需要注意在提交父项目时确保模块的修改也已经提交。 总之,使用 Git submodule 可以方便地在父项目中使用模块的组件,提高代码管理的灵活性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值