Git submodule subtree 使用 区别

使用场景:多个项目代码在版本控制服务器,不同项目代码需要直接复用,依赖和被依赖项目能够双向同步代码。

环境要求:

Git:https://git-scm.com/download

TortoiseGit:https://tortoisegit.org/download/

Git代码托管平台账号:https://gitee.com/

submodule子模块:

官方介绍 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 分支名字

subtree:

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根据需要和主项目或被依赖项目关联。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章