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 -- ...
随机推荐
- 学习C++ Primer 的个人理解(零)
由于自己看书之后经常容易忘记细节,所以写在博客上让我自己的思路更加清晰一些. 我的博客仅仅只是将书中的内容概括一下,有一些不好理解的部分我会用我自己理解的方式使用大白话写出来. 仅此而已.
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- java.util.AbstractStringBuilder源码分析
AbstractStringBuilder是一个抽象类,是StringBuilder和StringBuffer的父类,分析它的源码对StringBuilder和StringBuffer代码的理解有很大 ...
- iOS 简单理解类的本质
1.类也是个对象 类是一个对象是Class类型的对象简称类对象 Class类型的定义 // 一个任意的类型,表示一个Objective-C类 typedef struct objc_class *Cl ...
- Weui 微信网站开发样式插件使用教程
微信的网页样式正式发布了,搜了一下,正式引入了乐学一百微信端的项目中. <div class="weui_grids"> <a href="javasc ...
- HTMLImageElement类型的简便利用
这个是我在复习书籍的时候看见的,当时一个同学想通过页面发送请求,但是数据量不是太大,所以用的get方式,但是页面用表单提交请求的话会让页面进行跳转,当时我在网上查了一点资料,发现基本上都是通过ajax ...
- PHPCMS 核心代码与 www 分离部署
为了满足更多用户二次开发的兴趣与爱好,同时,为了更加安全.可以通过修改入口代码的包含方式来让主程序和www程序分开. 先看下面目录结构: (图1) 我们需要将 phpcms 目录和 index.php ...
- hdu 5172 GTY's gay friends
GTY's gay friends 题意:给n个数和m次查询:(1<n,m<1000,000);之后输入n个数值(1 <= ai <= n):问下面m次查询[L,R]中是否存在 ...
- 【IT历史】SP和CP
1.什么是SP?SP是英文Service Provider的缩写,中文翻译为服务提供商,通常是指在移动网内运营增值业务的社会合作单位.它们建立与移动网络建立相连的服务平台,为手机用户提供一系列信息服务 ...
- 自动寻路NavMesh
步骤 1.创建地形 2.添加角色 3.创建多个障碍物,尽量摆放的复杂些,用来检测NavMesh的可用性和效率 4.选中地形,在Navigation窗口中,设置Navigation Static 5.依 ...