赞
踩
诉求:希望把一个lib做成maven 的效果,各个工程都可以依赖,实现复用。 但是maven 独立项目的特点决定了他的开发成本和维护成本都比较高。
方案一:lib 随工程走,阶段性的用 beyond compare 这类比较器同步,通过手动的方式阶段性的维护一个 复用库。
优点: 首次操作简单
缺点:不好同步,后期会懒得同步,都是手动
方案二:使用git 技巧。在项目工程中希望,其中一个library 工程,既属于本工程, 又属于另一个独立的git项目。 把该library 作为一个 独立的lib进行维护,方便与其他工程复用。
本文围绕方案二阐述。
经过琢磨 git submodule 可以满足方案二
应本文述求,构建场景:
场景一,已经在使用主工程了,在主工程中添加 lib_widget 作为sub模块
git submodule add <submodule_url> # 添加子项目
添加完,会自动下载 widget 里的代码。
- PS D:\work\vv_official\test> git submodule add git@gitee.com:lckj686/leon_widget.git
- Cloning into 'D:/work/vv_official/test/leon_widget'...
- remote: Enumerating objects: 37, done.
- remote: Counting objects: 100% (37/37), done.
- Receiving objecting objects: 100% (25/25), done.
- remote: Total 37 (delta 6), reused 0 (delta 0)
- Receiving objects: 100% (37/37), 6.50 KiB | 2.17 MiB/s, done.
- Resolving deltas: 100% (6/6), done.
在工程的git根目录可以看到子模块的描述文件 .gitmodules
- [submodule "leon_widget"]
- path = leon_widget
- url = git@gitee.com:lckj686/leon_widget.git
git clone --recurse-submodules <main_project_url> # 获取主项目和所有子项目源码
- PS D:\work\vv_official\test\test5> git clone --recurse-submodules git@gitee.com:lckj686/custom_app.git
- Cloning into 'custom_app'...
- remote: Enumerating objects: 116, done.
- remote: Counting objects: 100% (116/116), done.
- remote: Compressing objects: 100% (93/93), done.
- Receiving objects: 76% (89/116)used 0 (delta 0)R
- Receiving objects: 100% (116/116), 129.91 KiB | 437.00 KiB/s, done.
- Resolving deltas: 100% (16/16), done.
- Submodule 'leon_widget' (git@gitee.com:lckj686/leon_widget.git) registered for path 'leon_widget'
- Cloning into 'D:/work/vv_official/test/test5/custom_app/leon_widget'...
- remote: Enumerating objects: 40, done.
- remote: Counting objects: 100% (40/40), done.
- remote: Compressing objects: 100% (28/28), done.
- remote: Total 40 (delta 8), reused 0 (delta 0)
- Receiving objects: 100% (40/40), 6.70 KiB | 979.00 KiB/s, done.
- Resolving deltas: 100% (8/8), done.
- Submodule path 'leon_widget': checked out '7ec79d2c32304e602379b0dd94934fed5d91b6a1'
**注意:**看是两个工程的分别clone
场景三,先拉主工程,在主工程中直接拉 sub模块,主工程已经配置好sub
git submodule update --init --recursive
如果用命令行操作sub模块,要先cd到模块目录。
- PS D:\work\vv_official\test\leon_widget> git branch
- * master
场景二,和场景三 拉到的子模块,子模块默认是没有指向分支。要自己手动checkout 到目标分支
- D:\work\vv_official\test\custom_app\leon_widget>git branch -a
- * (HEAD detached at 7ebe0f2)
- master
在本诉求中,子模块在实际使用中会有多分支或者多tag,要注意指定和切换分支。 子模块的分支与merge 操作与git 的普通操作一样。
4.2、针对Android的 Android studio 3.4.1 可以很直观的看到sub模块的状态
2. 查看当前文件所处的 仓库/分支
首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。
- 删除一个submodule
- 1.删除 .gitsubmodule中对应submodule的条目
-
- 2.删除 .git/config 中对应submodule的条目
-
- 3.执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为: git rm --cached supports/libs/websocket
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。