使用场景:多个项目代码在版本控制服务器,不同项目代码需要直接复用,依赖和被依赖项目能够双向同步代码。
环境要求:
Git:https://git-scm.com/download
TortoiseGit:https://tortoisegit.org/download/
Git代码托管平台账号:https://gitee.com/
官方介绍 https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
TortoiseGit使用submodule介绍 https://tortoisegit.org/docs/tortoisegit/tgit-dug-submodules.html
方式一:使用TortoiseGit UI界面实现submodule的功能
(1)进入Project目录,右键->TortoiseGit->Submodule Add...
(2)填上被依赖项目Git地址,子模块文件夹名
(3)点击OK即可添加成功。项目目录下会新增一个子模块文件夹和.gitmodule文件
其中.gitmodule内容为:
[submodule "xcrash"]
path = xcrash
url = https://gitee.com/DanielChenAD/xCrash.git
(4)从被依赖的项目更新代码到本地
进入项目目录,右键->Git Sync...
可以通过Submodule Init和Submodule Update更新子模块代码。通过Submodule Sync去更新.gitmodule文件内容。
其中Remote URL需要配置本项目的git地址,而不是子模块的git地址。
(5)项目代码的子模块部分提交变更到被依赖项目。
先进入模块目录,然后右键->Git commit submodule...,提交完成后,再push到服务器。
方式二:使用命令实现子模块功能
(1)添加子模块依赖
git submodule add 被依赖的项目Git地址
//例如 git submodule add https://gitee.com/DanielChenAD/xCrash.git
(2)子模块更新代码
//默认更新代码
git submodule update
//直接从服务器更新代码
git submodule update -remote
//拉取各个工程代码
git submodule update -init -resursive
注意事项:
(1)完全删除子模块
git rm -r -cached 子模块名称
rm -rf .git/modules/子模块名称
(2)切换分支
git checkout 分支名字
TortoiseGit不支持subtree的UI操作。目前只能用命令。
(1)添加subtree依赖
git checkout 分支名
git subtree add --prefix=<本地存放被依赖项目文件夹名> <被依赖项目的Git地址> <分支> --squash
//例如
//git subtree add --prefix=xcrash https://gitee.com/DanielChenAD/xCrash.git master --squash
(2)更新subtree依赖代码
先pull
git subtree pull --prefix=<存放被依赖项目的文件夹> <被依赖项目的Git地址> <分支> --squash
//例如
//git subtree pull --prefix=xcrash https://gitee.com/DanielChenAD/xCrash.git master --squash
再fetch
git fetch <被依赖的Git项目地址> <分支>
//例如
git fetch https://gitee.com/DanielChenAD/xCrash.git master
(3)提交subtree依赖代码的变更到服务器
先commit,这里也可以在Android Studio的Version Control中的Local Changes去提交。这是submodule没法做到的。
git commit -a -m "提交描述信息"
再push
git subtree push --prefix=<存放被依赖项目的文件夹> <被依赖项目的Git地址> <分支>
//例如
//git subtree push --prefix=xcrash https://gitee.com/DanielChenAD/xCrash.git master
submodule和subtree对比
submodule只存在引用,代码Pull和Push都只能和 被依赖的项目关联。
subtree直接克隆被依赖项目,代码Pull和Push根据需要和主项目或被依赖项目关联。