Git - - subtree与submodule

2023-05-16

https://www.cnblogs.com/anliven/p/13681894.html

目录

  • 1 - 仓库共用(子仓库、子项目)
  • 2 - submodule 与 subtree 对比
    • 2.1 git submodule
    • 2.2 git subtree
  • 3 - subtree
    • 3.1 在父仓库中新增子仓库
    • 3.2 父仓库的改动
    • 3.3 拉取子仓库的更新
    • 3.4 推送子仓库的修改
    • 3.5 子仓库切出起点
  • 4- submodule
    • 4.1 在父仓库中新增子仓库
    • 4.2 拉取整个仓库
    • 4.3 修改子仓库
    • 4.4 更新子仓库
    • 4.5 删除submodule

 


回到顶部

1 - 仓库共用(子仓库、子项目)

两种子仓库使用方式

  • git submodule(子模块)
  • git subtree(子树合并)

从1.5.2版本开始,官方新增Git Subtree并推荐使用这个功能来替代Git Submodule管理仓库共用(子仓库、子项目)

回到顶部

2 - submodule 与 subtree 对比

2.1 git submodule

  • 可以将其他仓库某个commit作为仓库的子目录
  • 克隆仓库需要额外的步骤 init 和 update
  • 产生.gitmodule文件记录和submodule版本信息
  • 删除submodule步骤繁琐
  • 可以在子仓库单独查看子仓库的修改记录,相当与在一个单独的仓库内,对外层父仓库不可见

2.2 git subtree

  • 官方推荐方式
  • 不增加.gitmodule等文件
  • 管理和更新流程简洁,对于项目中的其他成员透明(意味着可以不知道subtree的存在)
  • 本质就是把子项目目录作为一个普通的文件目录,对于父级的主项目来说是完全透明的,原来是怎么操作现在依旧是那么操作
  • 无法直接单独查看子仓库的修改记录,因为子仓库的修改包含在父仓库的记录中了。
回到顶部

3 - subtree

3.1 在父仓库中新增子仓库

cd <父仓库>
git subtree add --prefix=<子仓库在父仓库的相对路径> <子仓库地址> <branch> --squash

# 参数–squash: 表示不拉取历史信息,只生成一条commit信息,也就是不拉取子项目完整的历史记录

如果不需要更新或推送子仓库的改动,那么对于其他项目人员来说,可以不需要知道子仓库的存在。
也就是说,在这种情况下,子仓库就相当于父仓库的一个普通目录。

注意:
如果在子仓库发生改动(更新和修改)后,在父仓库中运行git status查看到子仓库文件显示modified,需要在父仓库中使用 add commit push 提交推送。
也就是说,子仓库的更改是会反映在父仓库的更改上的,因此只要是对子仓库进行了修改,无论如何都需要对父仓库进行一次提交。

示例:

cd temp-test-1
git subtree add --prefix=sub/temp-test-2 <temp-test-2 address> master --squash

此时通过git log可以查看到新增两条commit

commit b76c7b190760f33e7ae9dfeba40136e39309b737 (HEAD -> master)
Merge: b0aec0a e6a10bc
Author:
Date:
<span class="hljs-keyword">Merge</span> <span class="hljs-keyword">commit</span> <span class="hljs-string">'e6a10bc748638240ff372ae19c747584b7d8d1af'</span> <span class="hljs-keyword">as</span> <span class="hljs-string">'sub/temp-test-2'</span>

commit e6a10bc748638240ff372ae19c747584b7d8d1af
Author:
Date:

Squashed <span class="hljs-string">'sub/temp-test-2/'</span> content <span class="hljs-keyword">from</span> <span class="hljs-keyword">commit</span> bfb58a3

git<span class="hljs-operator">-</span>subtree<span class="hljs-operator">-</span>dir: sub<span class="hljs-operator">/</span>temp<span class="hljs-operator">-</span>test<span class="hljs-number">-2</span>
git<span class="hljs-operator">-</span>subtree<span class="hljs-operator">-</span>split: bfb58a379631813584d286ee00a19a79860f9562


3.2 父仓库的改动

在父仓库目录下查看状态和提交修改都和原来一样,保持不变。

3.3 拉取子仓库的更新

git subtree pull --prefix=sub/temp-test-2 <temp-test-2 address> master --squash

3.4 推送子仓库的修改

git subtree push --prefix=sub/temp-test-2 <temp-test-2 address> master

3.5 子仓库切出起点

可以将子项目当前版本切出为一个分支,作为 push 时遍历的新起点,这样以后每次遍历都只从上次切出的分支的起点开始,不会再遍历以前的了,节约时间。
这个分支只是作起点储存用的,不用管它不用修改不用推送到远程库。
需要更新这个起点时,只需要再在当前版本上再切出一个作起点的分支覆盖原来的,命令和第一次切出分支作起点时相同。

git subtree split [--rejoin] --prefix=<本地子项目目录> --branch <主项目中作为放置子项目的分支名>

注意:
如果 push 时使用了 --squash 参数合并提交,那么 split 时不能使用 --rejoin 参数,反之必须使用。

回到顶部

4- submodule

git clone <repository> --recursive  # 递归的方式克隆整个仓库,包含父仓库和子仓库的内容
git submodule add <repository address> <path> # 添加子仓库
git submodule init  # 初始化子仓库,向.git/config文件写入子模块的信息
git submodule update  # 更新子仓库,拉取父仓库中对应子仓库的提交id内容到到父仓库目录
git submodule foreach git pull  # 拉取所有子仓库

4.1 在父仓库中新增子仓库

cd <父仓库>
git submodule add <子仓库地址> <子仓库在父仓库的相对路径>

命令执行成功后

  • 父仓库根目录下会产生.gitmodules文件,包含子仓库的path和url信息, 并且.gitmodules在父仓库的git版本控制中
  • 父仓库的git配置文件中加入了submodule字段,包含子仓库的url信息
  • 父仓库.git目录下生成modudles文件夹,包含子仓库的所有相关信息

示例: 在父仓库中新增子仓库并提交子仓库信息

cd <project>
git submodule add <module repo addr> <module path>
git add *
git commit -m "add submodule"
git push origin master

4.2 拉取整个仓库

如果单纯使用git clone命令,克隆一个包含子仓库的仓库,并不会clone子仓库的内容。
需要执行本地.gitmodules初始化的命令,再同步远端submodule源码。

方式1: 获取父仓库和所有子仓库的内容

git clone <父仓库地址> --recursive  或者 git clone <父仓库地址> --recurse-submodules

# 使用参数--recursive,Git会自动递归去拉取所有的父仓库和子仓库的相关内容

方式2:

git clone <父仓库地址>
git submodule init && git submodule update  或者  git submodule update --init --recursive

# - git submodule init # 初始化本地.gitmodules文件
# - git submodule update # 同步远端submodule源码

4.3 修改子仓库

如果子仓库发生改动,需要先在子仓库提交,然后再到父仓库提交。
子仓库提交结束后,在父仓库的根目录执行 git status 命令会显示子仓库有新的提交。

示例:

cd <project>/<module>
git branch
echo "This is a submodule." > sm.txt
git add *
git commit -m "add sm.txt"
git push

cd …
git status
git diff
git add *
git commit -m “update submodule add sm.txt”
git push

4.4 更新子仓库

非子仓库的开发人员只需在父仓库下pull代码时,如果发现submodule有更改,执行git submodule update进行更新,然后将改动提交到父仓库。
默认的使用git status可以看到父仓库中submodule commit id的改变。

方式1: 先pull父项目,然后执行git submodule update

cd <project>
git pull
git submodule update

方式2: 先进入子模块,然后切换到需要的分支,然后对子模块pull

cd <project>/<module>
git checkout master
cd ..
git submodule foreach git pull

4.5 删除submodule

方式1:

git submodule deinit -f <submodule>  # 逆初始化模块,子模块目录将被清空
git rm --cached <submodule>  # 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存)
git submodule  # 没有显示子模块信息
git commit -m "remove submodule"

方式2:

git rm -rf <子仓库在父仓库的相对路径>
rm -rf .git/modules/<子仓库名称>
vim .git/config  # 删除submodule相关的内容
git commit -m "remove submodule"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git - - subtree与submodule 的相关文章

  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • DVCS命令的统一

    当处理多个 开源 项目时 多个版本控制系统开始出现问题 虽然它们共享共同的操作 但我经常在输入时犯错误hg add反而git add 我记得前段时间看到过一个项目 通过提供基本命令以统一的方式访问不同的源代码控制软件提交 ci add等在外
  • 无法使用 git 配置文件进行 ssh

    我知道它被问了很多次 但我无法得到我的问题的答案 我正在尝试使用配置文件 ssh 到系统 配置文件是 Host qa HostName 10 218 70 345 User user IdentityFile C Users bean ss
  • Jenkins git 插件 - 有时太慢

    以下内容摘自 Jenkins 日志 00 00 03 135 gt git fetch tags progress email protected cdn cgi l email protection some org some repo
  • 代表 Git 存储库的数学结构是什么

    我正在学习 Git 如果我能描述一下代表 Git 存储库的数学结构 那就太好了 例如 它是一个有向无环图 它的节点代表提交 它的节点有代表分支等的标签 每个节点最多一个标签 没有标签使用两次 我知道这个描述不正确 我只是想解释我正在寻找的内
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • 为什么我无法创建/签出该分支?

    我正在尝试创建本地 Git 分支 但它不起作用 以下是我正在使用的命令 tablet edit11 git checkout b edit 11 Switched to a new branch edit 11 tablet edit11
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • 致命:.git/info/refs 无效:这是一个 git 存储库吗?

    我有一个托管在 Assembla 上的 Git 存储库 我正在尝试执行以下操作 git push u origin master 我一遍又一遍地收到以下错误 fatal https url repo name git info refs n
  • 如何合并两个连续的 git 存储库

    我有一个相当独特的情况 我有一个名为 Project1 的存储库 我在其中工作了一些时间 几个月 一年后 我创建了存储库 Project1 Again 从 Project1 停止的地方开始 现在 我希望修订历史记录是连续的 因此我希望它们合
  • 默认情况下 git merge -Xignore-space-change

    我该如何设置该选项ignore space change对于所有合并使用git config 我也许可以使用别名merge 但因为我希望该设置应用于git stash pop git stash apply git pull and git
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • GIT:以下未跟踪的工作树文件将被签出覆盖

    我有两个分支 一个称为 master 另一个称为 dev 我目前位于 master 分支 我想转到 dev 分支将文件移动到开发服务器 但是当我执行 git checkout dev 我收到消息 以下未跟踪的工作树文件将被覆盖 查看 pag
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • 将bitbucket发布到数字海洋

    我本质上是试图使用 bitbucket 来理解 git 的概念 我一直在通过修改本地帐户和 bitbucket 帐户之间的文件来练习版本控制 事实证明这很有帮助 现在我正在尝试弄清楚如何将文件从 bitbucket 或者我猜是 GitHub
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • git reflog 和 log 有什么区别?

    手册页说 log 显示提交日志 reflog 管理 reflog 信息 reflog 信息到底是什么 它有哪些日志没有的信息 日志看起来更详细 git log显示当前的 HEAD 及其祖先 也就是说 它打印提交 HEAD 指向的提交 然后打

随机推荐

  • 牛客中C++/C语言的一道练习题详解

    解题思路及涉及知识点 xff1a 先简单判断一下 xff0c 程序最终是要打印k的值 xff1b k的值由两次循环中的fun函数的返回值决定 xff1b fun函数中 xff0c 变量c是静态的 xff1b fun函数中第三行代码a 61
  • QT基本组件与常用类

    目录 一 设计师 Designer xff08 掌握 xff09 二 布局 Layout 2 1 布局的基本使用 xff08 掌握 xff09 2 2 布局属性 xff08 掌握 xff09 2 3 伸展器 xff08 掌握 xff09 2
  • QT多窗口编程与文件IO编程

    目录 一 消息对话框 QMessageBox xff08 掌握 xff09 二 常用窗口类 xff08 掌握 xff09 三 主窗口类 QMainWindow xff08 重点 xff09 四 parent参数 xff08 掌握 xff09
  • QT数据库-网络编程-打包

    目录 一 讲解之前 二 数据库基本操作 三 模糊查询 二 编程之前 三 通信结构 一 设置应用图标 xff08 熟悉 xff09 二 Debug和Release模式 xff08 掌握 xff09 三 动态链接库 xff08 掌握 xff09
  • Visual Studio 2022 的安装和创建C++项目

    下面我们来讲一下如何下载安装VS 2022并且创建C 43 43 项目 1 下载 首先 xff0c 我们来到VS的微软官网下载地址 xff1a https visualstudio microsoft com zh hans vs 然后点击
  • 一起自学SLAM算法:写在前面

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:第1章-ROS入门必备知识

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.3 ROS系统架构

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 关于NAND FLASH调试的一点总结

    https www freesion com article 5033494883 很久没接触过 nandflash 驱动 xff0c 最近工作又摸了 xff0c 于是顺便整理总结一下 nandflash 在我看来算是比较落后的存储设备 x
  • 一起自学SLAM算法:1.6 ROS其他重要概念

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.7 ROS2.0展望

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:第2章-C++编程范式

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 2 1 C 43 43 工程组织结构 2 2 C 43 43 代码编译方法 2 3 C 43 43 编
  • 一起自学SLAM算法:第3章-OpenCV图像处理

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 3 1 认识图像数据 3 2 图像滤波 3 3 图像变换 3 4 图像特
  • 一起自学SLAM算法:第5章-机器人主机

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 5 1 X86与ARM主机对比
  • 一起自学SLAM算法:第6章-机器人底盘

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 6 1 底
  • 一起自学SLAM算法:第7章-SLAM中的数学基础

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第8章-激光SLAM系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:8.1 Gmapping算法

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:8.2 Cartographer算法

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • Git - - subtree与submodule

    https www cnblogs com anliven p 13681894 html 目录 1 仓库共用 子仓库 子项目 2 submodule 与 subtree 对比 2 1 git submodule2 2 git subtre