使用Git Submodule管理子模块
转自:https://segmentfault.com/a/1190000003076028
使用场景
基于公司的项目会越来越多,常常需要提取一个公共的类库提供给多个项目使用,但是这个library
怎么和git
在一起方便管理呢?
我们需要解决下面几个问题:
如何在git项目中导入
library库
?library库
在其他的项目中被修改了可以更新到远程的代码库中?其他项目如何获取到
library库
最新的提交?如何在clone的时候能够自动导入
library库
?
解决以上问题,可以考虑使用git的 Submodule
来解决。
什么是Submodule?
git Submodule
是一个很好的多项目使用共同类库的工具,他允许类库项目做为repository
,子项目做为一个单独的git项目
存在父项目中,子项目可以有自己的独立的commit
,push
,pull
。而父项目以Submodule
的形式包含子项目,父项目可以指定子项目header
,父项目中会的提交信息包含Submodule
的信息,再clone父项目
的时候可以把Submodule
初始化。
在项目中使用Submodule
使用git
命令可以直接添加Submodule
:
git submodule add git@github.com:jjz/pod-library.git pod-library
使用 git status
命令可以看到
git status
On branch master
Changes to be committed:
new file: .gitmodules
new file: pod-library
可以看到多了两个需要提交的文件:.gitmodules
和 pod-library
.gitmodules
内容包含Submodule
的主要信息,指定reposirory
,指定路径:
[submodule "pod-library"]
path = pod-library
url = git@github.com:jjz/pod-library.git
可以看到记录了子项目的目录和子项目的git
地址信息。pod-libray
内容只保护子项目的commit id
,就能指定到对于的git header
上,例如:
Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5
4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5
就是子项目的commit id
,父项目的git并不会记录Submodule
的文件变动,它是按照commit git
指定Submodule
的git header
。
另外,这两个文件都需要提交到父项目的git中。
还可以这样使用命令添加Submodule
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
修改Submodule
首先需要确认有对Submodule的commit权限。
进入Submodule
目录里面:
cd pod-library/
修改其中的一个文件看下文件的可以用git status
查看变动:
git status
modified: pod-library/UseAFHTTP.h
提交Submodule
的更改内容:
git commit -a -m'test submodule'
然后push
到远程服务器:
git push
然后再回到父目录,提交Submodule
在父项目中的变动:
cd ..
git status
on branch master
modified: pod-library (new commits)
可以看到pod-library
中已经变更为Submodule
最新的commit id
:
Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
需要把Submodule
的变动信息推送到父项目的远程服务器
git commit -m'update submodule'
git push
这样就把子模块的变更信息以及子模块的变更信息提交到远程服务器了,从远程服务器上更新下来的内容就是最新提交的内容了。
更新Submodule
更新Submodule
有两种方式:
在父项目的目录下直接运行
git submodule foreach git pull
在Submodule的目录下面更新
>cd pod-library
git pull
可以看到在Submodule
的目录中,使用git
和单独的一个项目是一样的,注意更新Submodule
的时候如果有新的commit id
产生,需要在父项目产生一个新的提交,pod-libray文件中的 Subproject commit
会变为最新的commit id
。
clone Submodule
clone Submodule
有两种方式 一种是采用递归的方式clone整个项目,一种是clone父项目,再更新子项目。
采用递归参数
--recursive
git clone git@github.com:jjz/pod-project.git --recursive
输出结果:
loning into 'pod-project'...
remote: Counting objects: 57, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 57 (delta 13), reused 49 (delta 8), pack-reused 0
Receiving objects: 100% (57/57), 18.79 KiB | 0 bytes/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
Submodule 'pod-library' (git@github.com:jjz/pod-library.git) registered for path 'pod-library'
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
Resolving deltas: 100% (8/8), done.
Checking connectivity... done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c
42092b20506b0d296d90d0b5f'
可以看到init Submodule
会自动被clone
下来
2.第二种方法先clone父项目,再初始化Submodule
git clone git@github.com:jjz/pod-project.git
cd pod-project
git submodule init
输出:
Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
registered for path 'pod-library'
更新Submodule
:
git submodule update
运行结果:
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
Resolving deltas: 100% (8/8), done.
Checking connectivity... done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'
删除Submodule
git
并不支持直接删除Submodule
需要手动删除对应的文件:
cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules
更改git的配置文件
config
:
vim .git/config
可以看到Submodule
的配置信息:
[submodule "pod-library"]
url = git@github.com:jjz/pod-library.git
删除submodule相关的内容,然后提交到远程服务器:
git commit -a -m 'remove pod-library submodule'
代码地址:
父项目:https://github.com/jjz/pod-project
子项目:https://github.com/jjz/pod-library
使用Git Submodule管理子模块的更多相关文章
- [转]使用Git Submodule管理子模块
本文转自:https://blog.csdn.net/qq_37788558/article/details/78668345 实例代码: 父项目:https://github.com/jjz/pod ...
- 转:Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- git submodule 管理子项目
使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repo ...
- 使用git submodule管理一个需要多个分立开发或者第三方repo的项目
在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ...
- git submodule的使用
1.在项目中使用Submodule 为当前工程添加submodule,命令如下:git submodule add 仓库地址 路径仓库地址:是指子模块仓库地址URL.路径:指将子模块放置在当前工程下的 ...
- Git submodule 子模块的管理和使用
因为代码分了两个小组管理,一部分代码使用跨平台语言实现,一部分使用原生实现. 所以使用Git submodule 来进行管理. 1,查看/更新 子模块 $ git submodule add ssh: ...
- git submodule git 子模块管理相关操作
Git 子模块操作相关的一些命令备忘: # 当使用git clone下来的工程中带有submodule时,初始的时候 submodule的内容并不会自动下载下来的,需执行如下命令: git submo ...
- Git submodule - 子模块【转】
子模块 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使 ...
随机推荐
- Python - 列表与字符串的互相转换
题目:请将text字符串中的数字取出,并输出成一个新的字符串 text = "aAsmr3 idd4bgs7Dlsf 9eAF" b = list(text) new_list = ...
- AWT事件模型
1.什么是事件 1)事件------描述发生了什么的对象 [事件与异常类似,是由一个个类构成的,当一个事件产生的时候,实际上是由对应的那个事件的类来生成了一个对象,这个对象封装了与这个事件相关的信息, ...
- python中关于if-else使用性能的一点感悟
今天做leetcode第7题关于数字倒序的问题,分别使用如下程序:(72ms) class Solution: def reverse(self, x): """ :ty ...
- SPFA算法 O(kE)
主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束. 这个算法,简单的说就是队列优化 ...
- P4811 C’s problem(c)
P4811 C’s problem(c)From: admin 时间: 1000ms / 空间: 65536KiB / Java类名: Main 背景 清北NOIP春季系列课程 描述 题目描述 小C是 ...
- BSGS算法学习
嗯哼大步小步法. 一个非常暴力的想法. 注意到如果设C = ⌈√P⌉,那么任何一个数都可以写 成a1 * C + b1的形式,其中a1, b1 都< C. 那么预处理出A^i*C的值.然后在询问 ...
- Windows 7 MBR的修复与Linux产品正确卸载
这几天折腾系统很令人崩溃,但也明白了开机引导流程具体如何. 觉得Centos 7不好用,想卸载Redhat安装Ubuntu,为了图方便直接把红帽的硬盘区格式化了.于是开机引导崩溃,咨询了下大神,大神叫 ...
- C语言sscanf和sprintf输入输出使用及Strlen、Memset解释
sscanf() - 从一个字符串中读进与指定格式相符的数据. swscanf()- 用于处理宽字符字符串,和sscanf功能相同 通过学习和使用个人认为,在字符串格式不是很复杂,但是也并不 ...
- PHP PSR 代码规范基本介绍
PSR 是 PHP Standard Recommendation 的简写,即PHP推荐标准. 目前通过的规范有 PSR-0(Autoloading Standard).PSR-1(Basic Cod ...
- 【Go命令教程】7. go run
Go 源码文件包括:命令源码文件.库源码文件 和 测试源码文件.其中,命令源码文件 总应该属于 main 代码包,且在其中有无参数声明.无结果声明的 main 函数.单个命令源码文件可以被单独编译,也 ...