首页 > 其他分享 >git子模块的使用

git子模块的使用

时间:2023-01-05 10:01:09浏览次数:35  
标签:submodule -- 命令 git 模块 使用 推送

1. 在项目中添加子模块

命令: git submodule add <url>

例子: git submodule add https://github.com/chaconinc/DbConnector

此命令在当前工作目录添加了一个名为"DbConnector"的子模块,且子模块地址为:https://github.com/chaconinc/DbConnector,另外这条命令会在当前工作文件夹添加两个文件.gitmodulesDbConnector

然后你可以将本次的添加子模块的动作提交并推送到仓库:

$ git commit -m 'added DbConnector module'
$ git push origin master

2. 克隆含有子模块的项目

命令:

$ git clone https://github.com/chaconinc/MainProject
$ git submodule init
$ git submodule update

第一条命令会将主项目的内容克隆下来,但是子模块DbConnector的内容不会被克隆。第二条命令是用来初始化本地配置文件,而第三条命令才是抓取子模块对应远程仓库的内容。

可以将上述三条命令合并成一条:

$ git clone --recurse-submodules https://github.com/chaconinc/MainProject

也可以将三条命令合并成两条:

$ git clone https://github.com/chaconinc/MainProject
$ git submodule update --init

3. 在包含子模块的项目上工作

经过上面的clone,在本地已经有了一个包含子模块的项目的副本,如何同时在主项目和子模块项目上与队员协作?

3.1 从子模块的远端拉取上游修改

命令:

  • 手动拉取并合并(子模块目录下)

    $ git fetch
    $ git merge origin/master
    

    此时提交,子模块就会锁定为其他人更新时的新代码。

  • 自动拉取合并(主项目目录下)

    $ git submodule update --remote
    

    此命令会默认拉取子模块仓库的master分支,也可以设置为想要的其他分支。

    此时,在主项目目录下运行git status,Git会显示子模块有“新提交”。

3.2 从主项目远端拉取上游更改

命令:

$ git pull
$ git submodule update --init --recursive

第一条命令会递归地抓取子模块的更改,但是不会更新子模块。此时运行git status,Git会显示子模块“已修改”且“有新的提交”,其实这些更改和提交已经在MainProject中有了记录,只是没有在本地的子模块中记录而已,所以需要更新子模块,因此需要使用第二条命令,此时再运行git status则不会再有上述的提示。

上述命令也可以合并为一条:

$ git pull --recurse-submodules

此命令会自动完成子模块的更新工作。

3.3 在子模块上工作

命令:

1. $ cd DbConnector
2. $ git checkout stable
3. $ cd ..
4. $ git submodule update --remote --merge
5. $ cd DbConnector/
6. $ vim src/db.c
7. $ git commit -am 'unicode support'
8. $ cd ..
9. $ git submodule update --remote --rebase

第1行:进入到子模块目录
第2行:切换到子模块中的stable分支
第3行:主目录
第4行:拉取子模块上游更改并合并到本地
第5行:进入到子模块目录
第6行:创建db.c
第7行:提交本地更改
第8行:进入主目录
第9行:再次拉取上游更新并合并到本地

第9行中如果忘记了添加--rebase/--merge,GIt会将子模块更新为服务器上的状态。此时需要回到子模块目录中再次检出你的分支,然后手动合并或变基。

如果没有及时提交本地修改,即没有执行第7行,直接进行了8,9,那也不要紧,此时Git会只抓取更改而并不会覆盖子模块目录中没有保存的工作。

如果运行第9行时出现冲突,像往常一样解决冲突即可。

3.4 发布子模块改动

现在子模块目录中有一些改动(一些是通过更新从上游引入的,另一些是本地生成的)。如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人就会遇到麻烦,他们无法得到依赖的子模块的改动。

命令(主目录下):

$ git push --recurse-submodule=check
$ git push --recurse-submodule=on-demand 

第一条命令会在推送主项目之前检查所有子模块是否已经推送,如果有任何提交的子模块没有推送,那么推送就会失败。

第二条命令会在推送主项目之前检查所有子模块是否已经推送,如果有任何子模块没有推送,那么推送之,直至所有子模块推送完毕,再推送主项目。再此期间,任何子项目推送失败都会导致主项目推送失败。

标签:submodule,--,命令,git,模块,使用,推送
From: https://www.cnblogs.com/kn-zheng/p/17026720.html

相关文章

  • Ansible安装及简单使用
    一、配置免密互通参考地址:https://www.cnblogs.com/qq1035807396/p/16998602.html二、开始安装Ansible1、添加repoyuminstall-yhttps://dl.fedoraproject.org/......
  • 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss
    前言什么是RSS?RSS是一种描述和同步网站内容的格式,是使用最广泛的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个RSS......
  • SQL Access group by 使用注意事项
    SQLAccessgroupby使用注意事项在MSSQL中正常的语句:selectField1,sum(Field2)asField2nfromTableswheregroupbyField1orderbyField2desc在Access......
  • 微信小程序canvas验证码生成及使用
    先看效果:  wxml:<canvasclass="v-code"bindtap="changeImg"style="width:100px;height:40px;"canvas-id="canvas"></canvas>js:constMCAP=require('.......
  • HelloGitHub 最受欢迎的开源项目 Top10(2022年)
    再见2022,你好2023!HelloGitHub也随着2023年的到来,更新到了第81期开始迈向第7个年头啦。在过去的2022年,我们一共发布了12期月刊、分享了502个开源项目,Hel......
  • python中模块的__all__属性详解
    python中模块的__all__属性详解python模块中的__all__属性,可用于模块导入时限制示例1普通类#kk.pyclassA():def__init__(self,name,age):self.name......
  • 使用Jmeter轻松实现AES加密测试
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试大家在自......
  • 使用Let's Encrypt 安装配置免费SSL 证书教程
    一、Let'sEncrypt简介Let'sEncrypt是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。简单的说,借助Let'sEncrypt颁发的证......
  • GIT多场景下使用
    git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰......
  • JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来2 —— Ehcache的各种项目集成与使
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......