Git submodule实战
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.git和proj.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实战的更多相关文章
- git submodule 实战
1.git submodule指什么 关于git submodule是什么,可以看下面这个链接. https://www.cnblogs.com/hwx0000/p/14146838.html 2.g ...
- git submodule 使用小结
git submodule 使用小结 原文链接 http://blog.gezhiqiang.com/2017/03/08/git-submodule/###### Git Submodule 允许一 ...
- git submodule初用
git submodule主要是用于针对git项目中还存在git子模块的情况.在一般情况下,我们通过git clone 获取项目的时候会把项目中的所有信息都拿到.但是,如果相关中存在git子模块那么, ...
- git submodule 使用
这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...
- git submodule(转载)
From:http://www.worldhello.net/2010/01/26/425.html 删除 git submodule (git 库子模组) 有两种情况会创建 git submodul ...
- Git submodule 特性
当你习惯了代码的 VCS 后,基本上是离不开的. 作为一个依赖多个子项目组成的项目,要实现直观的代码逻辑结构,可以考虑使用 Git submodule 特性. 当然,如果只是单独的依赖的话,用依赖管理 ...
- Git subtree和Git submodule
git submodule允许其他的仓库指定以一个commit嵌入仓库的子目录. git subtree替代git submodule命令,合并子仓库到项目中的子目录.不用像submodule那样每次 ...
- 使用git submodule管理一个需要多个分立开发或者第三方repo的项目
在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ...
- git submodule的操作
对于有submodule的库,检出的方法是: git clone https://github.com/BelledonneCommunications/linphone-android.git -- ...
随机推荐
- MFC通过ADO操作Access数据库
我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...
- 策略模式(Strategey Pattern)
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 下面举个例子: 有两个具体策略,分别执行两个整型加法和减法. interface Strateg ...
- PHP 类和继承
//定义一个超类 //public 和 protectd属性和方法可以继承,private不可继承. class A{ public $a =0; private $b = 1; protected ...
- 不要停留在表面,MVC 3 我们要深入一些
其实在MVC 中只存在三大组件,Model.View.Controller,其中Model用来作为业务逻辑处理,Controller负责的是Model和View的交互,View负责页面显示. 这是非常 ...
- python(二)基础
1.lambda表达式(一般格式为冒号前边是参数冒号后边是返回值) 单参数: 多参数: 我们如果实现一个普通的filter过滤函数过滤掉偶数: 而我们如果用lambda表达式就很简便: 2.递归 普通 ...
- AngularJS(3)-过滤器
过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中.. 1.uppercase/lowercase 大小写过滤器 2.currency过滤器 3.向指令添加过滤器 过滤器可以通过一个管道字符( ...
- 整理grep实战文本搜索过滤技巧
一:grep的简介: 文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行.配合正则表达式的使用可以实现强大的文本处理.下面一一说明正则的例子. 二:文本处理工具分类 ...
- Python 爬虫入门(requests)
相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2.在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D 他们是 ...
- PL/SQL — 隐式游标
一.隐式游标的定义及其属性 定义 隐式游标由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性.其过程由oracle控制,完全自动化.隐式游标的名称是SQL,不能对SQL游标显式地执行OPE ...
- Java学习-数组
1.数组的是Object的直接子类,它属于“第一类对象”,但是它又与普通的java对象存在很大的不同,类名为:[I 一维数组:[I 二维数组:[[I 三维数组:[[[I 2.[代表了数组的维度,一个[ ...