当前位置: 首页 > article >正文

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方式。


http://www.kler.cn/a/543936.html

相关文章:

  • openEuler社区git lfs服务上线
  • 七、I2C通信读取LM75B温度
  • Flutter项目试水
  • Java知识速记:ArrayList 和 Array
  • linux部署node服务
  • 香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。
  • windows蓝牙驱动开发-支持蓝牙事件通知
  • 为什么 ARCGIS PRO ArcGISIndexingServer.exe 使用大量计算机内存?
  • UGUI下UI元素的position和localPosition
  • 计算机网络和操作系统常见面试题目(带脑图,做了延伸以防面试官深入提问)
  • docker nginx 配置文件详解
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 10
  • MFC程序设计(十一)单文档架构
  • 从时间同步到智能调度:TSN时间敏感网络如何提升工厂安全性
  • 【Elasticsearch】Kibana Dev Tools中基础使用
  • AI前端开发:革新工作环境与团队协作
  • Java小白入门基础知识(一)
  • 基于Spring Boot的分布式网上售卖系统设计
  • 【Raqote】 0 Rust 2D图形库Raqote概览
  • AGI时代的认知重塑:人类文明的范式转移与思维革命
  • 打开Visual Studio Code的时候发现未检测到适用于linux的windows子系统,那么该问题要如何解决?
  • EffectiveC++读书笔记——item36(不要重定义继承的非虚拟函数)
  • vue中使用lodash的debounce(防抖函数)
  • 如何安装和运行Zonos:详细步骤指南
  • ES6具体有什么
  • 爬虫瑞数5.5案例:某钢材交易官网(面向对象补环境)