Git Submodule简单操作
基于组件的项目很多,但是如果直接用包的方式直接引用到项目中,如果出现问题很难进行调试的操作,也很难进行组件的优化和管理,所以写了一篇文章来介绍下git submodule的用法,用submodule可以一定程度上解决组件难以管理的问题。接下来我用两个测试项目来演示下submodule的基本用法。
新建Git仓储库
在本地clone我们的父项目,并查看当前repository状态
添加子模块
命令:git submodule add XXXXX
查看当前repository状态,除了刚刚添加的 公共库模块外,还多了一个 .gitmodules 文件。这个文件就是用于记录子模块的路径对应远程版本库地址的地方
这两个文件处于待提交状态,我们把它推送到服务器。查看我们当前repository的目录
可以看见在我们git repository中多出一个modules的文件夹,这个是存放的我们子模块reposirory的相关信息,父模块不会记录submodule的变动,只会记录一个子模块提交日志的指针,后面我们可以在更新中看到相关的内容。到此为止,我们的子模块就建立完毕了,下面来说下submodule的一些操作。
到码云中查看我们当前的项目结构
可以在我们的项目目录中看见我们submodule引用的repository,后面的数据就是我们submodule提交的指针。我们把公共类库中的项目引用到当前项目,就能进行正常的开发调试工作了。但是为了强化我们公共类库的管理,一方面不能大范围的开放commit权限,另一方面我们使用中也尽量使用fork的方式来避免一些误操作更改了我们的公共类库(这种方式在更新方面就有点麻烦)。
submodule的更新
我们在公共类库中添加了一个名为SubModuleTest.txt的文件,并推送到服务器。
在我们项目中更新子模块组件使用命令 git submodule foreach git pull
可以看见我们指针的变化,而且当前reposirory有一个新的待提交更改,为什么更新之后还需要提交?其实,Git 在父仓库中记录了一个子模块的提交日志的指针,用于保存子模块的提交日志所处的位置,以保证无论子模块是否有新的提交,在任何一个地方克隆下项目时,各个子模块的记录是一致的。避免因为所引用的子模块不一致导致的潜在问题。如果我们更新了子模块,我们需要把这个最近的记录提交到版本库中,以方便和其他人协同。这也是刚刚添加完子模块后还要在父仓库中提交一次的原因。
把项目推送到码云上后,在码云中可以见看见我们指针的更改。
submodule克隆
clone Submodule有两种方式 一种是采用递归的方式clone整个项目,一种是clone父项目,再更新子项目。主要说下第一种方式这是最新的也是较简便的方式。
1. 采用递归参数 –recursive
git clone https://git.oschina.net/DekeXing/TestSubmoduleParent.git –recursive
可以看到init Submodule 会自动被clone下来。但是克隆submodule的时候可能因为用户名的原因而导致错误,可以提前让git记住账户名密码使用指令 git config –global credential.helper store
submodule删除
git rm XXXX
submodule的坑
submodule项目和它的父项目本质上是2个独立的git仓库。只是父项目存储了它依赖的submodule项目的版本号信息而已。如果你的同事更新了submodule,然后更新了父项目中依赖的版本号。你需要在git pull之后,调用 git submodule update来更新submodule信息。
这儿的坑在于,如果你git pull之后,忘记了调用 git submodule update,那么你极有可能再次把旧的submodule依赖信息提交上去。对于那些习惯使用 git commit -a的人来说,这种危险会更大一些。所以建议大家:
–.git pull之后,立即执行git status, 如果发现submodule有修改,立即执行git submodule update
–.尽量不要使用 git commit -a, git add命令存在的意义就是让你对加入暂存区的文件做二次确认,而 git commit -a相当于跳过了这个确认过程。
另外尽量不要在子模块中进行修改,即使用的是fork的方式,我们组件的修改还是统一到组件的reposirory中进行维护。
最后说下组件的问题,尽量把组件设计得低耦合一点,采取接口的方式,让组件的修改尽大可能不影响到组件的依赖项。
Git Submodule简单操作的更多相关文章
- git submodule的操作
对于有submodule的库,检出的方法是: git clone https://github.com/BelledonneCommunications/linphone-android.git -- ...
- git submodule相关操作
$ cd 项目目录 // 初始化 $ git init $ git submodule add https://github.com/XXXX // 普通更新 $ git submodule upda ...
- 关于git的简单操作
首先这篇随笔我是不太想写的,因为网上有很多教程,我也是看廖雪峰大神的git教程自学的.还是一个小学生,就当一个学习笔记了,如果你想看大神的原版,请点击这里.我们原来都是用svn的,但是越来越觉得svn ...
- Git的简单操作
一.Git安装 windows下,可在在git官网下载(https://git-scm.com/downloads) 也有360提供的git(http://baoku.360.cn/soft/show ...
- git submodule一些操作
checkout指定tag cd /path/to/yoursubmodule git checkout yourTag cd .. git add yoursubmodule git commit ...
- Git Bash 简单操作
在Windows下使用Git Bash,用的是Linux命令,常用几个文件操作命令如下: Windows命令 Linux命令 意义 cd e:\xxx cd /e/xxx 切换到xxx目录 cd pw ...
- Git标签 简单操作
感谢廖雪峰老师,以下内容多数来自老师的Git教程. 另有部分参考Git中文文档. 创建 命令git tag <tagname> [commit id]用于新建一个标签,默认为HEAD; 也 ...
- Git Submodule使用完整教程
Git Submodule功能刚刚开始学习可能觉得有点怪异,所以本教程把每一步的操作的命令和结果都用代码的形式展现给大家,以便更好的理解. 1.对于公共资源各种程序员的处理方式 每个公司的系统都会有一 ...
- Git submodule update 命令执行
git submodule update操作可能导致执行.gitmodules文件中定义的任意shell命令. 受影响的产品 Git版本2.20.0至2.24.0 修复版本 Git v2.24.1,v ...
随机推荐
- iOS中关于UIApplication的详细介绍
UIApplication 什么是UIApplication? UIApplication对象是应用程序的象征.每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它 ...
- Unix - 文件中构成一个空洞的分析
lseek函数显示地为一个打开文件设置偏移量,文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的.位于文件中但没有写过的字节都被读为 ...
- myeclipse和输入法冲突的问题
问题:在myeclipse中编写注释的时候,偶尔出现繁体字的现象令人头疼. 原因:myeclipse中格式化快捷键为"ctrl+shift+f" 与搜狗输入法快捷键冲突.按下后输入 ...
- Auto Create Editable Copy Font(Unity3D开发之二十二)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/48318879 ...
- EBS form 之间跳转实现(form 关闭)
实现 form CUXOMWB 使用 app_navigate.execute 打开 form CUXOEXPRAVA :然后 FROM CUXOEXPRAVA 上点击按钮 跳回from CUXOMW ...
- 【5】-阿里面试题android网络图片加载优化
题目: 遇到网络不好,卡顿的时候如何对网络的加载图片进行优化? 思路: 从加载的图片的本身和手机的存储两方面考虑 解决办法: 1.找现有图片格式的替换者 在众多的图片格式中,选择了Google的Web ...
- 如何在Eclipse CDT中编译含有多个main函数的项目
最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...
- 使用XStream是实现XML与Java对象的转换(3)--注解
六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...
- combination sum、permutation、subset(组合和、全排列、子集)
combination sum I.permutation I.subsets I 是组合和.全排列.子集的第一种情况,给定数组中没有重复的元素. combination sum II.permut ...
- java设计模式--简单工厂
java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...