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 -- ...
随机推荐
- update语句
[update cicm.cicmodt0702 set msgbody = :1 where msgid between :2 and :3 ] [update cicm.cicmo ...
- iOS 详细解释@property和@synthesize关键字
/** 注意:由@property声明的属性 在类方法中通过下划线是获取不到的 必须是通过 对象名.属性 才能获取到!- @property和@synthesize关键字是针对成员变量以及get/se ...
- display:block; 块级元素。<a>,<span>标签设置宽度和高度
display:block;是让对象成为块级元素(比如a,span等) 转化后 可以对a或者span标签进行width和height设置,否则设置不了 display有很多对象,具体可以参考http: ...
- 【6】了解Bootstrap栅格系统基础案例(1)
从上一张我们了解了栅格选项,那么我们就来了实战了解下吧(其实还是中文官网的案例) ps.我这里是电脑上用谷歌浏览器来观察的,毕竟电脑的分辨率高(1440*900px),谷歌浏览器最大化后,值比大屏幕设 ...
- Python 基础篇:字典、集合、文件操作
字典 字典一种key - value 的数据类型 1. 语法: info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe ...
- [Python][flask][flask-login]关于flask-login中各种API使用实例
本篇博文跟上一篇[Python][flask][flask-wtf]关于flask-wtf中API使用实例教程有莫大的关系. 简介:Flask-Login 为 Flask 提供了用户会话管理.它处理了 ...
- WPF学习笔记3——Layout之1
一.概述 了解XAML的基本之后,进入Layout的学习.Layout,即布局,可能需要用到几种不同的容器.每一种容器都有各自的逻辑.在用户界面的设计过程中,很多时候是在想办法使得界面更加吸引.实在. ...
- log4j配置文件写法
### direct log messages to stdout ###log4j.rootLogger=DEBUG,stdoutlog4j.appender.stdout=org.apache.l ...
- android开发两种退出程序方式(killProcess,System.exit)
KillProcess: 在android中我们如果想要程序的进程结束可以这样写: android.os.Process.killProcess(android.os.Process.myPid()) ...
- SWFUpload 中文乱码问题
解决办法:两种: 第一种:把handlers.js的编码方式改为UTF-8(用记事本打开,选择编码格式为utr-8即可) 第二种:在有swfupload控件页面的page_load种加: Respon ...