文章目錄
- 背景
- subtree優勢
- submodule切換到subtree腳本
- subtree使用
- 切開發分支
- 推送代碼
- 同步代碼
背景
submodule過多,目前20個submodule需要切出20個分支,查看提交記錄、切分支等使用起來麻煩。
團隊深受困擾!
subtree優勢
- 繼承submodule的優點,基礎功能倉庫,可被其他多個倉庫同時使用
- 開發時,不需要再切n個分支,也不需要提到不同倉庫,只需要往主倉庫推送即可,一個倉庫一個分支,搞定日常開發,讓開發工作更愉快
- 代碼合并時,不需要再合那么多子倉庫
submodule切換到subtree腳本
可以一鍵切換,但是要注意m_branch的更改,更改為子模塊你想追蹤的分支名
#!/bin/bash
# set -e
m_branch="release/3_5_6_2"
cat .gitmodules | while read i; doif [[ $i == \[submodule* ]]; thenecho converting $iread impath=$(echo $i | grep -E "(\S+)$" -o)echo path: $mpathread imurl=$(echo $i | cut -d= -f2 | xargs)echo url: $murlmname=$(basename $mpath)echo name: $mname# 先獲取 commit,必須在 git rm 之前mcommit=$(git ls-tree HEAD "$mpath" | awk '{print $3}')echo commit: $mcommitgit submodule deinit -f "$mpath"echo "11"git add .git commit -m "#40664 Stage .gitmodules changes before removing submodule"git rm -r --cached "$mpath"echo "22"rm -rf "$mpath"echo "33"git config -f .gitmodules --remove-section "submodule.$mpath" || trueecho "44"git config --remove-section "submodule.$mpath" || trueecho "55"git commit -m "#40664 Removed $mpath submodule at commit $mcommit"echo "66"if ! git remote get-url "$mname" &>/dev/null; thengit remote add "$mname" "$murl"fiecho "77"# git fetch "$mname"# 用 commit 創建臨時分支并用它 add subtree# git branch -f "_$mname" "$mcommit"echo "88"git add .git commit -m "#40664 Save changes before subtree add"echo "mpath:$mpath murl:$murl m_branch:${m_branch} "git subtree add --prefix="$mpath" "$murl" "${m_branch}"echo "99"# git branch -D "_$mname"echo "10"git commit -m "#40664 Converted $mpath submodule to subtree"echo "11"git push origin "${m_branch}"echofi
donegit rm -f .gitmodules
git commit -m "#40664 Removed .gitmodules after converting submodules"
subtree使用
接入subtree后,日常開發提交代碼,切分支等,都只對主倉庫進行操作,日常使用起來,就只是主倉庫。
更新的內容也只在主倉庫生效(默認子倉庫不會同步更新)
如需單獨更新子模塊倉庫,需要用特殊的命令
切開發分支
git checkout -b feature/3553_xzx_subtree
git push origin feature/3553_xzx_subtree
# 以上即可開始開發
推送代碼
git add 修改文件
git commit -m "修改內容"
git push origin feature/3553_xzx_subtree
# 以上即可推送修改到云端(只會更新quicktron倉庫),然后直接打包即可,會把提交的修改帶上
如果需要單獨推送子模塊倉庫(只開發quicktron,是不需要做這一步的)
例如params_api未來可能被quicktron以及算法那邊的倉庫共同使用,我們在params_api修復了bug,則需要推送到子模塊倉庫中去,讓算法那邊也可同步到我們的修改,則使用以下命令:
git subtree push --prefix=src/nav_process ssh://git@gitlab.flashhold.com:10022/hardware/upper_computer/basic/nav_process.git feature/3553_xzx_subtree
同步代碼
git pull origin release/3_5_5_3
git push origin feature/3553_xzx_subtree
# 以上即可同步最新修改到本地,并且推送到quicktron倉庫
如果需要單獨更新某個子模塊(只開發quicktron,是不需要做這一步的)
例如params_api被算法那邊修復了bug,并且已經推送到對應子倉庫了,那我們需要同步最新修改到qucktron
則使用以下命令:
git subtree pull --prefix=src/params_api ssh://git@gitlab.flashhold.com:10022/hardware/upper_computer/basic/nav_process.git release/3_5_5_3
git push origin feature/3553_xzx_subtree
在submodule初步切為subtree這段時間,可能有原先是submodule形式的提交,在nav_process子倉庫上的修改,需要同步到subtree形式的主線上,則也是使用以上指令。