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. (poj)1502 MPI Maelstrom

    题目链接:http://poj.org/problem?id=1502 Description BIT has recently taken delivery of their processor A ...

  2. “Assign Random Colors” is not working in 3ds Max 2015

    Go to Customize -> Preferences…-> General (tab) Uncheck “Default to By Layer for New Nodes”

  3. SVN查看提交日志的命令

    Windows下,使用svn客户端查看日志很方便,但是如果在linux下,常规查看日志的命令对于日志记录数比较多的时候,屏幕显示不了,就比较麻烦,后来发现了一个很有用的参数可以限制要查看的记录条数 查 ...

  4. java感触一则

    看到开源中国上边有那么多关于java的开源项目,从数据库到3D游戏再到IDE工具,甚至有iQQ,形形种种都是一些比较成熟的,工程很大的项目.才意识到Java是如此的强大和流行. 这么多开源的代码我不可 ...

  5. Apache的多路处理模块MPM:Prefork Worker Event

    如何确认当前apache使用哪种模式 通过/etc/init.d/httpd中的来确认系统apache的运行脚本路径 apachectl=/usr/sbin/apachectl httpd=${HTT ...

  6. C# DllImport的用法

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能 ...

  7. 常用Oracle SQL语句(汇总版)

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  8. 【GPS】 数据围栏

    1.记录gps信息,定位类型  gps  agps ,偏移量 2.根据id检索用户 gps 历史记录 3.创建围栏 4.围栏内用户检索(先实现 圆形和矩形) 5.判断一个点是否进出围栏 应用场景: o ...

  9. 【web安全】第六弹:手工SQL注入详解

    前一段时间,在对SQL注入有了新的理解之后,写了这篇文章.本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章 ...

  10. BeeFramework

    A semi-hybrid framework that allows you to create mobile apps using Objective-C and XML/CSS