004Git SubMoudle、SubTree 简单实用文档

#引言

平时在使用一个项目的,也没有很多公用的模块的时候,使用一个仓库管理就可以了,也很方便,但是如果有多个项目,公用一些子模块,那么这些子模块都是有独立仓库管理,在实际使用当中会有一些问题.
比如主项目依赖了子模块,各自都有独立的仓库,主项目有分支1和分支2,子模块有分支1和分支2,主项目分支1依赖子模块分支1,主项目分支2依赖子模块分支2.当主项目在分支1和分支2切换的时候,子模块并不会随着主项目的分支切换而切换,这里就会造成如果我打包的时候主项目1依赖的是子模块2就错了,但是我当时并没有注意到主项目依赖的模块分支已经切换了

切换之前

依赖
依赖
主项目分支1
子模块分支1
主项目分支2
子模块分支2

切换之后

依赖
主项目分支2
子模块分支1
主项目切换为分支2之后依赖的却是子模块分支1,我希望在主项目切换分支2之后子模块分支也切换到2

首先是如何将这些子仓库和主项目的仓库关联起来?
在SourceTree当中有子模块和子树的功能来对子仓库的管理.

Git SubMoulde

004Git SubMoudle、SubTree 简单实用文档_第1张图片
添加成功之后会在子模块下面出现一个lib模块,并且额外添加了两个文件,一个是.gitmodules(里面包含了依赖子模块的git地址),一个是lib(里面包含了commit信息,如果子模块的commit有修改,主项目提交的时候也需要把这两个文件更新的信息提交)
004Git SubMoudle、SubTree 简单实用文档_第2张图片
每一次子模块的commit,在主项目当中都会记录
004Git SubMoudle、SubTree 简单实用文档_第3张图片
子模块修改后需要主项目也commit一下
切换主项目分之后,如果对应的子模块的commit不对,我们可以手动修改子模块的分支点
004Git SubMoudle、SubTree 简单实用文档_第4张图片

Git SubTree

使用git subtree,可以将自仓库添加到主项目的根目录,对于其他使用者来说,并不会感知到子模块
004Git SubMoudle、SubTree 简单实用文档_第5张图片
—copy—
subtree 处理多层包含是没有问题的,因为包含进项目之后, 别人根本看不出这是一个 subtree, 所以它本质上还只是管理本地 repo 的一种方法。

使用 Git subtree 新建或更新子项目的时候,可以选用 --squash 参数, 它的作用就是把 subtree 子项目的更新记录进行合并,再合并到主项目中。

所以,在使用 --squash 参数的情况下, subtree add 或者 pull 操作的结果对应两个 commit, 一个是 Squash 了子项目的历史记录, 一个是 Merge 到主项目中。

这种做法下,主项目的历史记录看起来还是比较整齐的。 但在子项目有更新,需要 subtree pull 的时候,却经常需要处理冲突。 严重的,在每次 subtree pull 的时候都需要重复处理同样的冲突,非常烦人。

如果不使用 --squash 参数,子项目更新的时候,subtree pull 很顺利, 能够自动处理已解决过的冲突,缺点就是子项目的更新记录“污染”了主项目的。
—copy—
004Git SubMoudle、SubTree 简单实用文档_第6张图片
点击确定生004Git SubMoudle、SubTree 简单实用文档_第7张图片
该master分支依赖子模块的master分支,
添加以后会产生两个commit,一个是子模块当前的commit,一个是合并到主项目产生的commit
从master分支中开出一个新的分支develop,并修改子模块分支为develop.
这个时候如果从主项目develop分支切换到主项目,子树当中的模块并不会随着项目的切换而切换

问题

在配置submodule的时候,.gitmodules文件的url地址使用https或者http的,不要使用ssh,在本人自己电脑上没有问题,其他人会出现需要输入密码且一直错误,通过以下方式解决:http://www.hangge.com/blog/cache/detail_1561.html

总结

通过对Git SubModules和Git SubTree的对比,subModule能够记录commit点,即使主项目切换了分支还能找回对应的子模块的分支,个人认为这个比subtree要好很多.当然还可以通过其他方式对子模块管理,比如给子模块打版本号,通过maven依赖,aar等皆可.适合自己的才是最能提高开发效率的.

附言

Subtree类似IOS 的 CocoaPods ,实际上都是把代码依附到主项目下,在上传的时候,全部代码上传主仓库.

你可能感兴趣的:(Android)