使用場景:多個項目代碼在版本控制服務器,不同項目代碼需要直接複用,依賴和被依賴項目能夠雙向同步代碼。
環境要求:
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根據需要和主項目或被依賴項目關聯。