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根據需要和主項目或被依賴項目關聯。

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