Git 子模块 - submodule

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你 独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另一个。

Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

开始使用子模块

git submodule add remotePath [localPath]

克隆含有子模块的项目

git clone remotePath
git submodule init        # 初始化本地配置文件
git submodule update    # 从该项目中抓取所有数据并检出父项目中列出的合适的提交。

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

  1. 进入子模块目录中手动抓取与合并

    • 进入子模块目录
    • git fetch
    • git merger origin/master
    • 进入主仓库目录
  2. 直接在主仓库里抓取与合并子模块

    • git submodule update --remote
  3. 在子模块上工作

    当我们运行 git submodule update 从子模块仓库中抓取修改时,Git 将会获得这些改动并 更新子目录中的文件,但是会将子仓库留在一个称作 “游离的 HEAD” 的状态。 这意味着没有本 地工作分支(例如 “master”)跟踪改动。 所以你做的任何改动都不会被跟踪。

     git checkout stable                        进入子模块并检出相应的工作分支
     git submodule update --remote            从上游拉取数据
     git submodule update --remote --merge     从上游拉取数据并合并
    
  4. 发布子模块改动

    如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人会遇到 麻烦,因为他们无法得到依赖的子模块改动。 那些改动只存在于我们本地的拷贝中。

    为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。 git push 命令接受可以设置为 checkon-demand 的 --recurse-submodules 参数。 如果任何提交的子模块改动没有推送那么 check 选项会直接使 push 操作失败。

    • 提交主项目时自动检测子模块是否有未提交的改动

      git push --recurse-submodules=check

    • 提交主项目时,尝试自动推送一改动的子模块

      git push --recurse-submodules=on-demand

子模块技巧

  1. 子模块遍历

有一个 foreach 子模块命令,它能在每一个子模块中运行任意命令。 如果项目中包含了大量子模块,这会非常有用。

  1. 有用的别名

你可能想为其中一些命令设置别名,因为它们可能会非常长而你又不能 设置选项作为它们的默认选项。

子模块的问题

例如在有子模块的项目中切换分支可能会造成麻烦。 如果你创建一个新分支, 在其中添加一个子模块,之后切换到没有该子模块的分支上时,你仍然会有一个还未跟踪的子模块目录。

时间: 2024-10-18 11:21:33

Git 子模块 - submodule的相关文章

Git 子模块 - submodule(转)

原文地址: http://www.cnblogs.com/kelsen/p/5918672.html 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另一个. Git 通过子模块来解决这个问题. 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录. 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立. 开始使用子模块 git

Git 子模块:git submodule

imtianx 2018年03月08日阅读 2057 Git 子模块:git submodule 工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景.比如,在项目中引用第三方库.或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景.这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目. 可以使用 git submodule --help 查看所有相关命令. 为了方便说明,这

git中submodule子模块的添加、使用和删除

git中submodule子模块的添加.使用和删除 原文链接:https://blog.csdn.net/guotianqing/article/details/82391665背景项目中经常使用别人维护的模块,在git中使用子模块的功能能够大大提高开发效率. 使用子模块后,不必负责子模块的维护,只需要在必要的时候同步更新子模块即可. 本文主要讲解子模块相关的基础命令,详细使用请参考man page. 子模块的添加添加子模块非常简单,命令如下: git submodule add <url>

Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Schema的使用(Android业务组件化之URL Schema使用),今天重点来聊下子模块SubModule的拆分以及它们之间的路由Router实现.本篇涉及的相关知识比较多,阅读本篇之间需要大致了解一下Java的注解(Java学习之注解Annotation实现原理).Java的动态代理机制(Java设计模式之代理模式(Proxy))等.业务组件化是一个循序渐进的过程,一开始很难

Git - 子模块

工作中会遇到这样的问题,当你在一个项目上时,你需要在其中使用另外一个项目,这个项目也许是一个第三方开发的库或者是你独立开发 合并在多个项目中使用的.这样就会产生一个问题:你想将两个项目单独处理但是又需要其中一个项目使用另一个.而Git通过子模块处理这个问题,子模块允许你将一个Git仓库当做另一个Git仓库的子目录.允许你克隆另外一个仓库到你的项目中并且保持你的提交相对对立. 原文地址:https://www.cnblogs.com/wangrenmeng/p/9774510.html

git: 使用submodule进行托管

问题描述: 当一个prj.git项目里引用了另外一个moduleA.git项目作为其一个子模块,由于该模块未完善后续可能将继续升级,也就是需要两套git分别管理prj.git与moduleA.git,而prj.git又使用了moduleA.git. 使用submodule进行管理 1.  新建一个项目git 2. 新建一个mouleA.git 3. 在prj.git里添加moudleA.git. 带有submodule仓库的克隆方法 1. 直接clone的话是没有submodule信息的,只有文

git subtree submodule

https://blog.csdn.net/weixin_33860737/article/details/88940185 https://blog.csdn.net/weiwei9363/article/details/88128730 https://blog.csdn.net/liusf1993/article/details/72765131 原文地址:https://www.cnblogs.com/little-ab/p/12163225.html

git 命令大全(完整版)

Git 常用命令详解 Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. 1.Git文件操作 $ git help [command] # 显示command的help $ git show [$id] # 显示某次提交的内容 $ git checkout [file] # 抛弃工作区修改 $ git checkout . # 抛弃工作区修改 $ git add [file] # 将工作文件修改提交到本地暂存区 $ git add

Git Submodule管理项目子模块

使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone <repository> --recursive 递归的方式克隆整个项目 git submodule add <repository> <path> 添加子模块 git submodule init 初始化子模块 git submodule update 更新子模块 gi