git submodule 子模块的基本使用

这篇具有很好参考价值的文章主要介绍了git submodule 子模块的基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常用命令

命令 说明
git submodule add <url> <本地路径> 添加子模块
git submodule update --init --recursive 添加子模块后,同步子模块内容
git clone <url> --recurse-submodules 克隆带有子模块的项目
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule sync --recursive 子模块地址变更
git submodule deinit <project> 删除子模块

背景

浏览开源库的时候经常会看到如下子模块的引用情况。
git submodule 子模块的基本使用,git,git,submodule,子模块,包管理

子模块通常是项目比较复杂,需要对项目进行拆分,而项目又有引用关系时会使用。通常拆分项目后,我只需要关注自己的项目更改,不需要关注引用的项目都做了哪些更改。

通常这样拆分后,项目就不会在一个 git 仓库中,这时用 submodule 来管理代码仓库会清晰方便许多。

基本使用

添加子模块

git submodule add <url> <本地路径>,例:

git submodule add https://github.com/grassto/example.git example

执行完毕后,发现仓库目录下多了个 example 目录,但是里面没有任何文件,此时需要再执行:

git submodule update --init --recursive

这时会看到仓库有如下变化:

可以看到 .gitmodules 中有如下内容

[submodule "example"]
	path = example
	url = https://github.com/grassto/example.git

另外,.git/config 中会多出一块有关子模块的信息

[submodule "example"]
	active = true
	url = https://github.com/grassto/example.git

同时在 .git/mudules 目录下会多出 .git/mudules/example 目录。

克隆带有子模块的项目

直接 clone 只能拉取主项目的代码,需要多执行下 submodule 相关的命令,如下两种方式:

git clone https://github.com/grassto/example.git --recurse-submodules

先克隆,再初始化子模块拉取

git clone
git submodule init
git submodule update

更新子模块

git submodule update 
git submodule update --remote

不添加 --remote 参数,只更新子模块到该仓库使用的最新版本,例:

子模块一直在自己开发,更新了 1.0, 1.1, 1.2 版本,但是这时候我的主仓库只使用了 1.0 版本,使用 git submodule update 更新后,发现只能更新到 1.0 版本。

添加了 --remote 参数,则直接更新到子模块仓库的最新版本。

简单理解就是主仓库使用的就是特定版本的子模块仓库,若要更新,需要主仓库主动进行更新再提交。

子模块地址变动

git submodule sync --recursive

若子模块的 url 发生了改变,这时执行 git submodule update 会失败,可以使用 sync 来同步。

这个我没用过,官网上看到的,这里提一下。

删除子模块

git submodule deinit example
git rm example
git commit -m "delete submodule example"

推荐使用上面这种方式,当然也可以手动删除:

  • 删除本地子模块目录
git rm --cached example
rm -rf example
  • 删除 .gitmodules 子模块信息
[submodule "example"]
	path = example
	https://github.com/grassto/example.git
  • 删除 .git/config 文件中的子模块内容
[submodule "example"]
	active = true
	https://github.com/grassto/example.git
  • 删除 .git 文件夹中的相关子模块文件
rm -rf .git/modules/example

总结

  • 使用了 submodule 后,若不主动更新,项目会一直使用固定版本的 submodule 模块,需手动更新(git submodule update --remote)。
  • 若是在 go 或者其他有包管理的项目中,建议还是使用开发语言工具去做这种类似的第三方包管理会比较方便。

其他

作为一个 go 开发,我还是提议使用 go module 来做这种包管理,这里提一下我使用 submodule 的原因:

现在用到了一个包引用的是本地的,使用了 replace 特性,在做 gitlab CI 的时候,需要同步代码仓库,感觉不方便,顾使用了 git submodule 将代码作为子模块。这样就可以使用 gitlabGIT_SUBMODULE_STRATEGY: recursive 特性。

如果你也是个 go 开发人员,这里不建议这么用,因为 go module 是可以引用私有库的,我这样用是有历史原因的。

我需要引用的库的 go.mod 如下,modulenameexample 而不是 github.com/example

module example

go 1.18

require ......

使用该模块的时候都是将其拉到本地,然后 replace文章来源地址https://www.toymoban.com/news/detail-698152.html

module work

go 1.18

replace example => ./example

参考

  • 官方文档 Git-Tools-Submodules
  • Git中submodule的使用

到了这里,关于git submodule 子模块的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git 删除 submodule 子模块的步骤

    实验有效,这里删除了两个 submodule。 验证方法,当重新git clone 项目(先不加 --recursive 选项)后,   之后, ls .git/module 文件夹已经不存在 XXXX/ 与 YYYY/ 文件夹也不存在 这是就可以merge 进 master 中了。   其中,如果项目只有一个submodule,那么,删除 submodule 后,.gitmodules 中的

    2024年01月19日
    浏览(65)
  • 【Git】在Git项目中添加子模块项目 - submodule

    先clone a-project项目到本地。 进入你想添加b-project到a-project的目录,使用git命令添加子模块。 提交子模块到远程仓库 拉取/clone带有子模块的Git项目,直接拉取后子项目中可能没有任何内容,需要进行子模块初始化同步设置后,才能拉取完整的Git项目。 进入子模块目录 查看子

    2024年02月13日
    浏览(78)
  • git submodule 使用教程

    (1)项目很大参与开发人员多的时候,需要将各个模块文件进行抽离单独管理。 (2)使用git submodule来对项目文件做成模块抽离,抽离出来的文件可单独成为一个git仓库。整个主项目对抽离出来的子项目(子模块)有依赖关系,却又并不关心子项目(子模块)的内部开发流程

    2024年02月05日
    浏览(50)
  • Git中submodule的使用

    转自: Git中submodule的使用 - 知乎 面对比较复杂的项目,我们有可能会将代码根据功能拆解成不同的子模块。主项目对子模块有依赖关系,却又并不关心子模块的内部开发流程细节。 这种情况下,通常不会把所有源码都放在同一个 Git 仓库中。 有一种比较简单的方式,是在当前

    2024年03月14日
    浏览(49)
  • 如何使用git submodule:添加、查看、更新、修改、删除、克隆含submodule的项目

    Git submodule 功能可以让我们在一个仓库中添加另一个仓库作为当前仓库的子仓库,这样既方便了代码管理,也免去我们重复造轮子的精力和时间。注意:Git submodules 只是某个仓库某一时刻的一个状态的引用,即某个 commit 的引用。 添加远程项目默认分支 添加远程项目指定分支

    2024年02月04日
    浏览(44)
  • git 使用 submodule 如何指定分支

    写在前面, 作为一个前端我是不喜欢使用 submodule的, 我更喜欢 npm 包的管理方式。 首次添加子模块 git submodule add -b branch remote path 不指定分支就不传 -b branch branch 分支名 remote 仓库地址 path 子模块路径, 也就是你的文件下载路径 示例: git submodule add -b stable https://github.com/example/

    2024年03月13日
    浏览(66)
  • 使用git submodule解决高耦合度问题

    在开发我的笔记系统时,我遇到了一个问题。问题是,在api-gate服务中,我需要验证用户的access_code,但是access_code的生成逻辑是在auth2服务中实现的。这个问题从架构设计的层面上看,就是一个高耦合度问题。高耦合度会给代码的扩展代码麻烦,并给未来的系统维护带来隐患

    2024年02月02日
    浏览(39)
  • 解决github无法拉取submodule子模块的问题

    当使用 git clone --recursive url 拉取一个配置了子模块的仓库后,会卡住。 同时在使用 git clone 拉去 https 的 url 时,同样可能会出现一直卡在 cloning into reposity... 本文提供一个简单的脚本来解决该问题。 需要配置好 git 的相关配置, git user.name , git user.email , ssh 。 以 mxnet 的仓库

    2024年02月13日
    浏览(68)
  • Git常用命令submodule

    当程序比较大参与开发人员较多时,代码管理就复杂起来。代码如果全员可见,可以创建 share 分支维护共用代 码,可以创建 core 分支维护核心算法代码,各进程分别占一个分支,定期同步 share 和 core 分支。代码如果不 能全员可见,可以仓库中包含子仓库,子仓库管理模块代

    2024年02月08日
    浏览(45)
  • git submodule

    用于在 Git 子模块中初始化和更新子模块。让我们解释一下命令的各个部分: git submodule:这是用于处理 Git 子模块的主要 Git 命令。 –update 或 -u:此选项检查超级项目中记录的提交。它还将子模块的工作目录更新为超级项目中指定的提交。 –init 或 -i:此选项初始化在存储库

    2024年03月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包