git - 克隆带子模块的git工程的方法
文章目录
- git - 克隆带子模块的git工程的方法
- 概述
- 笔记
- 用SSH方式克隆带子模块的git项目url
- git操作环境
- 修改git bash命令行提示
- 修改git bash 窗口标题
- 升级git bash中的git到最新版本
- 先用SSH方式克隆项目本身
- 针对当前git库修改子模块url连接为ssh
- 循环克隆所有子模块
- 备注
git - 克隆带子模块的git工程的方法
概述
由于用https方式克隆git库url的网络通讯质量问题,已经知道怎么用ssh方式克隆git库url了。
今天遇到有个git库带子模块,而子模块默认的url是https的。且子模块还有可能带子模块(https url)。
做个试验,让整个git库的url克隆时,都采用SSH方式来弄。
笔记
用SSH方式克隆带子模块的git项目url
假设项目的ssh方式的git url 为 git@github.com:FreeRTOS/FreeRTOS.git
git操作环境
Git Bash // 装了git for windows就有
在Git Bash环境下的好处: 可以用一些linux同名的命令, e.g. sed命令,比自己直接在windows cmd中包含git路径,用git命令的好处多。
修改git bash命令行提示
// 只显示 bash名称 + ➤
PS1='\033[38;5;223m\033[38;5;223mGitBash\033[38;5;110m\033[38;5;110m➤\033[0m\033[0m '
效果
修改git bash 窗口标题
echo -ne '\e]0;GitBash\a'
效果
升级git bash中的git到最新版本
// 我当前的git版本为2.47.0, 可以用下面这个命令
git update-git-for-windows
// 升级时,要访问github, 请保持网络畅通
// 升级之后为2.47.1.2, 看来我手头的git版本也比较新,不升级也是可以的。
// 在命令行下载完成后,会弹出安装程序,并关掉git bash, 进行UI交互的普通安装。
// 如果自己的git就是最新版本,就只会显示一下,不会去再重复更新
先用SSH方式克隆项目本身
cd D:\3rd\MCU_prj
或者
cd /d/3rd/MCU_prj
git clone -v git@github.com:FreeRTOS/FreeRTOS.git FreeRTOS_offcial
先将原始库备份一下,方便做其他试验。
针对当前git库修改子模块url连接为ssh
// 必须进入当前git库目录中
cd FreeRTOS_offcial
// 找到所有 .gitmodules 的位置,运行下面指令,将https连接换为ssh连接。
sed -i ‘s|https://github.com/|git@github.com:|g’ .gitmodules
// 更新所有子模块规则
// 然后回到工程根目录,运行如下指令
git submodule sync --recursive
循环克隆所有子模块
让克隆子库时,有进度提示,免得心里慌。
如果项目中的子模块已经被初始化了,带上参数 --init 也没有副作用。
git submodule update --init --recursive --progress
克隆完后,再次查找有没有新的.gitmodules,再执行步骤"针对当前git库临时修改子模块url连接为ssh", 然后执行”循环克隆所有子模块“,直到没有新的.gitmodules出现,那么这个带子模块的工程就克隆完了。这是是手工的步骤,如果子模块自带的.gitmodules比较少,手工弄还可以。
如果修改完.gitmodules, 升级到配置,然后更新子模块,又带来很多的.gitmodules,再手工弄就够呛了。得写个脚本来弄。
先回到项目得顶层目录
cd /d/3rd/MCU_prj/FreeRTOS_offcial
试验好的git bash脚本
#!/bin/bash
# git bash 脚本 - 遍历修改当前目录下得所有 .gitmodules , 替换https 库 url 到 ssh 库 url
# 前置操作 : 写好my_task.sh后,给执行权限
# chmod 777 ./my_task.sh
# 前置操作 : 检查脚本的语法是否正确?
# bash -n my_task.sh
# 如果没看到输出,就说明脚本语法是正确的
# 运行脚本
# 进入到脚本的目录
# ./my_task.sh
clear
echo "---------- my_task.sh running ----------"
# echo "current user:(" $(whoami) ")"
# log begin time
echo "begin : ($(date '+%Y-%m-%d %H:%M:%S'))"
# =号两边不能有空格
file_cnt=0
find . -type f -name ".gitmodules" -print0 | while IFS= read -r -d '' file; do
dir=$(dirname "$file")
(
cd "$dir" || { echo "⚠️ dir switch err: $dir"; exit 1; }
# echo "finding $(pwd)/.gitmodules"
if [ -f "$(pwd)/.gitmodules" ]; then
echo "!!! ($((file_cnt + 1))) was found $(pwd)/.gitmodules, ready to process"
sed -i 's|https://github.com/|git@github.com:|g' .gitmodules
git submodule sync --recursive
fi
)
file_cnt=$((file_cnt + 1))
done
# log end time
echo "end : ($(date '+%Y-%m-%d %H:%M:%S'))"
上一轮更新子模块后,多了一些子模块,共25个。执行 ./my_task.sh
然后再更新子模块
git submodule update --init --recursive --progress
执行结果
GitBash➤ pwd
/d/3rd/MCU_prj/FreeRTOS_offcial
GitBash➤ git submodule update --init --recursive --progress
Skipping submodule 'FreeRTOS-Plus/Source/AWS/device-defender/test/unit-test/Unity'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/device-shadow/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/fleet-provisioning/test/unit-test/Unity'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/ota/source/dependency/3rdparty/tinycbor'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/ota/source/dependency/coreJSON'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/ota/test/cbmc/FreeRTOS-Kernel'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/ota/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/AWS/sigv4/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Application-Protocols/coreHTTP/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Application-Protocols/coreMQTT/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Application-Protocols/coreSNTP/test/unit-test/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/test/FreeRTOS-Kernel'
Skipping submodule 'FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/tools/CMock'
Skipping submodule 'FreeRTOS-Plus/Source/Utilities/backoff_algorithm/test/unit-test/Unity'
Skipping submodule 'FreeRTOS-Plus/Source/coreJSON/test/unit-test/Unity'
GitBash➤
脚本结果都是显示跳过,说明没啥要更新的,也没有错误发生。
看了.gitmodules的数量,还是25个,那么就更新完了。
备注
当前,用SSH方式迁出远端的git工程,如果网络畅通,都一次成功,没发现失败过。
用https迁出工程,没有一次能成功…, 看来,迁出git库url进行学习,只能是采用SSH方式。