子模块命令

本文详细介绍了如何使用Git子模块进行项目管理,包括添加、初始化、更新子模块的方法,以及如何在包含子模块的项目中同步子模块的更新。

子模块命令

  • cat .git/config读取配置,可以查看子模块有没有被注册

为一个项目添加子模块(http)

// 可以是远程git http地址
git submodule add ~/submd/repos/lib1.git libs/lib1

clone一个带子模块的项目(project1-b)

git clone ../repos/project1.git project1-b

// 对此项目的子模块进行检查 发现存在子模块 但是子模块文件夹内并未存在内容
git submodule
// 初始化子模块
git submodule init

// 拉取子模块
git submodule update

// 简化命令
git submodule init & update

在带子模块的项目里修改子模块然后更新子模块

project1中push之后其实就是更新了引用的commit id,然后project1-b在clone的时候获取到了submodule的commit id,然后当执行git submodule update的时候git就根据gitlink获取submodule的commit id,最后获取submodule的文件

- project1-b
	- libs
		- lib1
			- lib1-features
  1. cd libs\lib1 (当前就是libs的git)
// 其HEAD指向的hash和master指向的hash是一直的

➜ henryyan@hy-hp  /project1-b/libs/lib1  cat .git/HEAD
c22aff85be91eca442734dcb07115ffe526b13a1
➜ henryyan@hy-hp  /project1-b/libs/lib1  cat .git/refs/heads/master         c22aff85be91eca442734dcb07115ffe526b13a1
  1. 修改lib的文件内容,并提交推送lib1更新到lib1仓库
// 先切换到master分支
git checkout master

// 修改lib1-features
echo "add by developer B" >> lib1-features

// 提交更改
git commit -a -m "update lib1-features by developer B"

// 推送更改
git push

// 此时远程仓库lib已经更新
  1. 提交并推送付仓库project1-b中lib的更新

看看project1-b的状态

➜ henryyan@hy-hp  ~/submd/ws/project1-b git:(master)git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#		libs有一个新的提交
#   modified:   libs/lib1 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

libs/lib1的commit id由原来的c22aff85be91eca442734dcb07115ffe526b13a1更改为36ad12d40d8a41a4a88a64add27bd57cf56c9de2

➜ henryyan@hy-hp  ~/submd/ws/project1-b git:(master)git diff
diff --git a/libs/lib1 b/libs/lib1
index c22aff8..36ad12d 160000
--- a/libs/lib1
+++ b/libs/lib1
@@ -1 +1 @@
-Subproject commit c22aff85be91eca442734dcb07115ffe526b13a1
+Subproject commit 36ad12d40d8a41a4a88a64add27bd57cf56c9de2

提交这个lib1的commit更新到父仓库

cd project1-b使用父仓库的git

git add -u
git commit -m "update libs/lib1 to lastest commit id"
git push
  1. 另外一个项目拉取projetc1的内容

cd project1

// 拉取远程仓库的更新、得到子模块的commit-id
git pull
// 根据子模块的commit-id 拉取最新的子模块内容
// 能拉取最新的子模块内容
git update submodule

修改子模块后在存在此子模块的项目中进行同步

  1. 在project2的子模块lib1中进行了修改,并推送到了lib1的远程仓库

    cd libs/lib1
    git add README
    git commit -m "add file README"
    
  2. 更新project2的子模块commit id 到远程

    git add .
    git commit -m "update lib1 to lastest commit id"
    git push
    
  3. 在project1中拉取最新的lib1

    cd libs\lib1
    
    // 第一步在project2修改lib1时是在master上修改了,这里先切到master
    git checkout master
    git pull origin master
    
<think>好的,我现在需要帮用户解决如何用Git更新和下载全部子模块的问题。用户之前问过如何更新特定的Mavlink子模块,现在可能在使用过程中遇到了需要全部子模块的情况,或者想了解更全面的命令。 首先,用户的需求是“git 更新下载全部子模块命令”,也就是他们可能已经有一个包含多个子模块的项目,现在需要一次性更新或下载所有子模块。这可能出现在他们刚克隆了一个项目,但子模块没有初始化,或者项目更新后子模块的版本有变化的情况下。 我需要回顾Git子模块的相关命令。用户之前接触过`git submodule update --init`,但可能对更全面的步骤不太清楚。我需要给出初始化、更新、递归处理子模块命令,以及如何克隆项目时直接包含子模块。 另外,用户可能遇到的问题包括权限问题、网络问题导致子模块下载失败,或者子模块嵌套的情况。需要提供常见问题排查的方法,比如如何强制重新下载,如何处理嵌套子模块等。 还要考虑用户的使用场景,可能是在持续集成环境中自动化处理,或者个人开发时需要同步所有依赖。这时候可能需要提供一些高效的一行命令,比如克隆时带上`--recurse-submodules`参数。 需要分步骤说明,从初始化到更新,再到特定版本的切换,以及如何添加子模块。同时,要注意递归处理,因为子模块可能还有自己的子模块,所以`--recursive`参数很重要。 最后,确保命令的正确性,比如`git submodule update --init --recursive`是否正确,以及`git clone`时使用`--recurse-submodules`是否有效。另外,需要提醒用户注意子模块可能指向不同的分支,更新后可能需要提交主项目的变更。 可能还需要给出一些实际例子,比如如何克隆项目并包含所有子模块,如何批量更新所有子模块到最新提交等。同时,常见问题如权限问题、路径问题也需要提及解决方案,比如修改URL为HTTPS或SSH,或者检查路径是否正确。 总结下来,回答需要结构清晰,覆盖初始化、更新、克隆时的处理,递归选项,以及问题排查,确保用户能够全面了解如何管理所有子模块。</think>以下是 Git 更新和下载全部子模块的完整命令指南: --- ### **基础操作流程** #### **1. 首次克隆包含子模块的项目** ```bash # 最彻底的方式 (推荐) git clone --recurse-submodules https://github.com/yourproject/repo.git ``` #### **2. 已有项目初始化所有子模块** ```bash # 初始化 + 下载代码 git submodule update --init --recursive # 等价简写 git submodule update --init --recursive ``` --- ### **进阶操作** #### **强制更新所有子模块** ```bash # 丢弃本地修改,强制同步远程 git submodule foreach --recursive 'git reset --hard && git clean -fd' # 拉取所有子模块最新内容 git submodule update --remote --recursive ``` #### **并行加速下载** ```bash # 使用 parallel 工具加速 (需先安装) git submodule update --init --recursive --jobs=8 ``` --- ### **分支管理技巧** #### **跟踪特定分支** ```bash # 所有子模块跟踪 master 分支 git config -f .gitmodules submodule.*.branch master git submodule update --remote --recursive ``` #### **查看子模块状态** ```bash # 显示所有子模块的提交状态 git submodule status --recursive # 图形化查看差异 git diff --submodule=log ``` --- ### **典型工作流示例**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值