git(三) Submodule管理子模块

本文详细介绍了如何利用Git Submodule管理多个项目中的共享库,包括子模块的添加、更新、删除以及在克隆时自动导入的方法,解决了团队项目中类库更新和同步的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


layout: blog
istop: true
title: “git Submodule管理子模块”
date: 2018-08-25
category: 版本控制
tags:

  • 版本控制

使用场景

1). 公司的项目越来越多,通常需要提取一个公用的类库(如Model 层代码),但这个library 怎么和git 融合在一起方便管理呢?

  • 可以采用Maven 依赖进行,但是Maven 操作的缺点是:每次共用类库的更改都需要重新打入Maven本地仓库。所以此方式pass
    2). 公用库的抽离要解决的几个问题
  • 如何要在git 项目中导入公用库?
  • 其他项目修改了可以更新到远程的代码库中?
  • 每个使用公用库的项目,如何获取最新的提交?
  • 如何在克隆的时候自动导入公用库?

用例

神马是Submodule?

git Submodule是一个很好的多项目使用共同类库的工具,他允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commitpushpull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会的提交信息包含Submodule的信息,在clone父项目的时候可以把Submodule初始化

如何在项目中使用Submodule

这里举个实例进行说明,假设你有一个通用库git-module-sub和一个依赖于它的副项目git-module-parent

添加子模块命令

git submodule add git@github.com:anhusky/git-module-sub.git src/com/uu/husky

查看

 git status
    On branch master
    Changes to be committed:
    
        new file:   .gitmodules

可以看到项目下多了一个文件.gitmodules,包含了在父项目中公用模块的位置公用模块的url,文件内容如下:

[submodule "src/com/uu/husky/entity"]
    path = src/com/uu/husky/entity
    url = git@github.com:anhusky/git-module-sub.git

将子模块添加进入父项目

git add .gitmodules
git commit -m '子模块导入'
git submodule init
git push

查看子项目id

➜  git-module-parent git:(master) git submodule
+f62224770e12ba9a39cabcf9b9a8492ee2bc6bd0 src/com/uu/husky/entity (heads/master)

修改Submodule

首先确定要有权限

假设现在在父项目,子模块导入成功后,子模块内容已经被修改O

在子模块中进行提交的基本操作

cd git-module-sub
git status 
git add .
git commit -m '输入改动信息'
git push

进入父模块中,提交

获取状态,显示子模块更改了,我们需要提交一下让服务器端知道

git status
     modified:   src/com/uu/husky/entity (new commits)

git add .
git commit -m '子模块内容在父模块中更新了'
git push

更新Submodule

使用场景:别人改了公用模块中的东西

方法一

在父项目下直接运行

git submodule foreach git pull

方法二

在子项目中操作

cd git-module-sub
git pull

用在更新前后使用 git submodule,会发现 子模块id 更新了

克隆带有子模块

方式一

采用递归参数 --recursive

git clone git@github.com:anhusky/git-module-parent.git --recursive

使用idea 进行克隆的时候 后面加上 --recursive 参数即可

方式二

先克隆父项目,再初始化Submodule

git clone git@github.com:anhusky/git-module-parent.git 
cd git-module-parent
git submodule init

更新Submodule

git submodule update

删除Submodule

git 并不支持直接删除Submodule需要手动删除对应的文件:

cd git-module-parent

git rm --cached git-module-sub
rm -rf git-module-sub
rm .gitmodules
更改git的配置文件config:
vim .git/config

可以看到Submodule的配置信息:

[submodule "git-module-sub"]
  url =  git@github.com:anhusky/git-module-sub.git

删除submodule相关的内容,然后提交到远程服务器:

git commit -a -m 'remove git-module-sub submodule'

源码地址:

父项目地址

子项目地址

<think>我们正在讨论如何拉取所有子模块。根据引用[1][2][3]的内容,正确命令是: `git submodule update --init --recursive` 但是用户问的是 `git submodule update init all`,这个命令并不存在。正确的应该是`--init`和`--recursive`选项。 因此,我们应当指导用户使用正确的命令。 步骤: 1. 首先,克隆主仓库(如果还没有的话): `git clone <主仓库URL>` 2. 进入仓库目录: `cd <仓库目录>` 3. 初始化并更新所有子模块(包括嵌套子模块): `git submodule update --init --recursive` 解释: - `--init`:初始化子模块,将根据.gitmodules文件中的信息克隆子模块(如果尚未克隆)[^3]。 - `--recursive`:递归地处理子模块中的子模块(嵌套子模块)[^2][^3]。 如果用户已经克隆了主仓库,但没有初始化子模块,那么直接执行第步即可。 注意:引用[4]提到,如果克隆后没有.gitmodules文件,可能是因为该文件是隐藏文件(在Linux下以.开头),可以使用`ls -a`查看[^4]。另外,确保在正确的目录下执行命令。 因此,回答用户:正确的命令是`git submodule update --init --recursive`,而不是`git submodule update init all`。 同时,如果用户希望克隆主仓库的同时初始化并更新子模块,可以使用一条命令(Git 2.13及以上版本): `git clone --recurse-submodules <主仓库URL>` 这样就不需要再单独执行`git submodule update --init --recursive`了。 生成相关问题: 1. 如何添加一个新的Git子模块? 2. 如何更新子模块到最新版本? 3. 如何克隆包含子模块的仓库并自动初始化?</think>要拉取 Git 仓库中的所有子模块(包括嵌套子模块),正确命令是: ```bash git submodule update --init --recursive ``` ### 命令详解: 1. **`--init`** - 初始化所有子模块(根据`.gitmodules`文件配置)[^3] - 首次拉取时必须使用,否则子模块目录为空 2. **`--recursive`** - 递归处理所有嵌套子模块子模块中的子模块)[^2] - 确保完整拉取多层级依赖 ### 完整操作流程: ```bash # 1. 克隆主仓库 git clone https://github.com/user/project.git cd project # 2. 拉取所有子模块(关键步骤) git submodule update --init --recursive ``` ### 常见问题解决: 1. **缺少`.gitmodules`文件** - 使用 `ls -a` 查看隐藏文件(Linux/macOS)[^4] - 确保在仓库根目录执行命令 2. **权限问题** - 添加 `--depth 1` 仅拉取最新提交(加速下载): ```bash git submodule update --init --recursive --depth 1 ``` 3. **克隆时自动初始化**(Git 2.13+) ```bash git clone --recurse-submodules https://github.com/user/project.git ``` > **注意**:子模块本质上是被引用的独立仓库,此命令会: > 1. 克隆子模块仓库到指定路径 > 2. 检出父仓库记录的特定提交(非最新代码)[^1] > 3. 递归处理所有嵌套依赖[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值