http://blog.jqian.net/post/git-submodule.html

使用git管理的项目开发中,如果碰到公共库和基础工具,可以用submodule来管理。

常用操作

例如,

  • 公共库是 lib.git,地址:git@github.com:lib.git
  • 需要使用公共库的项目是 proj.git,地址:git@github.com:proj.git

添加

为项目proj.git添加submodule,先进到相应的目录下,然后执行如下命令:

git submodule add git@github.com:lib.git <local path>

其中,<local path>是你期望的目录名。

该命令实际会做三件事情:首先,clone lib.git到本地;然后,创建一个 .gitsubmodule 文件标记submodule的具体信息;同时,更新.git/config文件,增加submodule的地址:

[submodule "lib"]
url = git@github.com:lib.git

删除

首先,需要删除 .git/config 和 .gitsubmodle 文件里submodule相关的部分,然后执行:

git rm --cached <local path>

才能将submodule的相关文件从你的本地仓库里清理掉。

签出

如果要clone一个附带submodule的项目,submodule的文件不会自动随父项目clone出来(其实只会clone出.gitsubmodle 这个描述文件),还需要执行如下命令取出submodule里的文件:

git submodule init
git submodule update

或者,一条组合命令(同样适用于嵌套submodule的情况):

git submodule update --init --recursive

修改/更新

可能稍微违反直觉的是,如果submodule有更新,默认在本地父项目里执行git pull是不会更新submodule的。因为执行git submodule add xxx的时候,只是把submodule的当前commit id加入到本地父项目的索引里,如果你期望submodule的commit id同步到最新HEAD,则你还需要重新执行git add然后重新提交。

此后,其他开发成员需要执行git submodule update更新你刚才的这个submodule commit。这里一个需要注意的地方是,每次在父项目执行git pull后,应该执行git status查看一下submodule是否有更新;如果submodule有更新,则应该立刻执行git submodule update,否则你有可能把submodule的旧依赖提交到仓库里去。一个建议是,尽量不要执行git commit -a,它会让你忽略对staged文件的确认过程。

实际案例演示

常见情况

给出一个在父项目 proj.git 里添加submodule项目 lib.git 并使用的示例:

(用户A) 创建新的代码仓库:

mkdir proj
cd proj
git init
git add --all

(用户A) 添加pdlib作为submodule:

git submodule add git@github.com:lib.git
git commit -m "first commit with submodule"
git remote add origin git@github.com:proj.git
git push origin master

(用户B) 签出刚刚新建的代码仓库并使用:

git clone git@github.com:proj.git
cd foo
git submodule update --init --recursive

(用户B) 发现lib.git有修改,他把proj.git仓库的lib.git也同步到该版本:

cd lib
git pull
git status # 此时如果lib.git有修改,就可以看到not staged commit
cd ..
git add lib
git commit -m "update lib.git"
git push origin master

(用户C) 更新proj.git仓库,同时也需要更新submodule:

git pull origin master
git status # 记得执行git status,可以看到lib.git的改动
git submodule update

修改lib.git

【注】这种情况下,需要清楚lib.gitproj.git实际就是两个独立的git仓库,针对lib.git的修改,需要在lib目录下commit。注意submodule*必须*是在master分支修改,如果proj.git在其他分支上开发,那么针对lib目录的修改需要先切回master分支。

(用户D) 想直接在proj.git仓库里修改lib目录的内容:

cd lib
git checkout master # 注意修改lib需要在master分支上
edit xxx.txt
git add xxx.txt
git commit -m "update xxx.txt"
git push origin master

(用户D) 需要显式的把刚在lib目录上的修改添加到proj.git仓库里去:

cd proj
git status # 每次在commit之前查看一下status是好习惯
git add lib
git commit -m "update lib.git"
git push origin master

技巧

可以通过修改 ~/.gitconfig 简化一些操作,比如每次git pull完自动执行git submodule update

[alias]
psu = !git pull && git submodule update

这样,上面示例中用户C如下操作即可:

git psu

参考

Git submodule实战的更多相关文章

  1. git submodule 实战

    1.git submodule指什么 关于git submodule是什么,可以看下面这个链接. https://www.cnblogs.com/hwx0000/p/14146838.html 2.g ...

  2. git submodule 使用小结

    git submodule 使用小结 原文链接 http://blog.gezhiqiang.com/2017/03/08/git-submodule/###### Git Submodule 允许一 ...

  3. git submodule初用

    git submodule主要是用于针对git项目中还存在git子模块的情况.在一般情况下,我们通过git clone 获取项目的时候会把项目中的所有信息都拿到.但是,如果相关中存在git子模块那么, ...

  4. git submodule 使用

    这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...

  5. git submodule(转载)

    From:http://www.worldhello.net/2010/01/26/425.html 删除 git submodule (git 库子模组) 有两种情况会创建 git submodul ...

  6. Git submodule 特性

    当你习惯了代码的 VCS 后,基本上是离不开的. 作为一个依赖多个子项目组成的项目,要实现直观的代码逻辑结构,可以考虑使用 Git submodule 特性. 当然,如果只是单独的依赖的话,用依赖管理 ...

  7. Git subtree和Git submodule

    git submodule允许其他的仓库指定以一个commit嵌入仓库的子目录. git subtree替代git submodule命令,合并子仓库到项目中的子目录.不用像submodule那样每次 ...

  8. 使用git submodule管理一个需要多个分立开发或者第三方repo的项目

    在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ...

  9. git submodule的操作

    对于有submodule的库,检出的方法是: git clone https://github.com/BelledonneCommunications/linphone-android.git -- ...

随机推荐

  1. 在linux环境下配置node:node + npm + forever

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3574582.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  2. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  3. RX学习笔记:FreeCodeCamp的JavaScript基本算法挑战

    FreeCodeCamp的JavaScript基本算法挑战 https://www.freecodecamp.com 2016-07-03 JavaScript还不是非常熟悉,用已经会的知识来解这些题 ...

  4. C# 创建XML文档

    有些时候我们需要生成一个xml文档作为数据交换的容器.当然我们用拼接字符串的方法来进行构建xml,但是这种方法虽然简单有效,但是如果xml文档结构过于复杂,拼接字符串会让人眼花缭乱.这时候就需要C#给 ...

  5. oracle 11g实验五——触发器的使用

    实验要求: 实验五 触发器的使用 实验目的 1.  理解触发器的概念.作用及分类: 2.  掌握触发器的创建.使用: 实验内容 1.  建立表orders:用于存储订单列表信息:表order_item ...

  6. Ms SQLServer中的Union和Union All的使用方法和区别

    Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...

  7. Bios里,把SATA Mode Selection改为AHCI无法启动

    新装系统Win7_X64,将SATA Mode Selection改为AHCI后总是重启,baidu参考: SATA的硬盘就选AHCI(全称应该是SATA AHCI),AHCI可以提升硬盘的读写速度原 ...

  8. 使用openxml读取xml数据

    xml的数据格式如下: <?xml version="1.0"?> <Language Name="Chinese"> <Loca ...

  9. CODEVS 3943 数学奇才琪露诺

    [题目描述 Description] 作为上白泽慧音老师的出色弟子,数学奇才琪露诺在算术方面有很深的造诣.今天,codevs有幸请到了这位数学界的奇葩作为本场考试的第一题主考官. 琪露诺喜欢0-9之间 ...

  10. .net faq

    http://www.indiabix.com/technical/dotnet/ http://www.codeproject.com/Articles/637480/Csharp-and-ASP- ...