解决github无法拉取submodule子模块的问题

news/2024/11/6 23:29:23/

引言

当使用git clone --recursive url 拉取一个配置了子模块的仓库后,会卡住。
同时在使用git clone 拉去httpsurl时,同样可能会出现一直卡在cloning int reposity...本文提供一个简单的脚本来解决该问题。

前置准备

需要配置好git的相关配置,git user.namegit user.emailssh

问题一 使用git clone拉去https协议仓库时卡住

mxnet的仓库为例,如果使用https协议进行克隆,即通过命令https://github.com/apache/mxnet.git,可能会出现卡在cloning into mxnet...的情况。其实解决方法很简单,当将上面https协议的url改成ssh协议即可,即使用命令git clone git@github.com:apache/mxnet.git这样就不会卡住了,但是原理目前并不是很清楚。
注:即使使用ssh进行仓库的克隆,也是需要非常手段。同时需要配置ssh

问题二 拉取submodules时卡住

拉取子模块卡住还是因为在原始仓库中的配置中使用了https协议的仓库链接进行拉取,想要解决实际上只需要将仓库中的.gitmodules文件中的所有子模块的url改成ssh协议进行拉取即可。
修改只需要将url中的https:://github.com/替换成git@github.com:,但是手动修改的话比较麻烦,因为修改之后需要考虑拉取的子模块也会依赖其他子模块的情况,此时则还需要修改,因此本人简单写了一个脚本,通过递归来实现。代码如下:

#!/bin/bashpull_submodule_recursive()
{if [ -f ".gitmodules" ];thenecho ".gitmodules found"# backupcp .gitmodules .gitmodules.bakwhile read linedo# substitude the https with sshecho ${line} | sed 's/https:\/\/github.com\//git@github.com:/g' >> .new_gitmodulesdone < .gitmodulesmv .new_gitmodules .gitmodules# pull current submodulesgit submodule initgit submodule syncgit submodule update# get the directories of current submoduleslocal directories=$(cat .gitmodules | grep path | awk '{print $3}')for directory in $directoriesdoif [ -d $directory ];then# enter the directorypushd ${directory} > /dev/null# pull one submodule and its submodulespull_submodule_recursive# return to the last working directorypopd > /dev/nullfidoneelseecho "current submodule has no submodule, return to last directory..."fireturn 0
}pull_submodule_recursive

脚本的使用方法,以拉取mxnet为例:

  • 首先需要将不含有子模块的mxnet拉取下来,注意需要使用ssh进行拉取,即使用命令:git clone git@github.com:apache/mxnet.git
  • 进入到仓库路径,此时会在当前目录下出现mxnet目录,只需要进入该目录,创建一个文件,将上面的代码拷贝到文件中,这里我们把名字设置为get_submodules_recursive
  • 执行上述脚本,等待子模块拉取完成,一定要使用bash来执行,sh不支持pushdpopd命令会出现错误,即通过命令bash get_submodules_recursive进行执行。

执行效果如下图:
在这里插入图片描述
能够看到此时遍能够成功拉去子模块了,此时git status会显示有新的修改,因为修改了.gitsubmodules文件,不过这个问题不大,如果觉得不想修改的话,只需要根据提示通过git restore命令恢复即可

代码逻辑解释

代码会查找当前目录下的.gitmodules文件,只有找到改文件才回继续进行执行,当找到改文件后,会将改文件中的子模块的url改成ssh协议,更改完成后进行子模块的拉取,拉取后进入到每个子模块中进行检查子模块是否还有子模块…代码会一直重复上述的逻辑,知道所有的子模块全部拉取完成。
也就是代码执行的逻辑与git clone --recursive一致只是在每次拉去的时候需要修改.gitmodles中的url

可悲


http://www.ppmy.cn/news/884507.html

相关文章

Windows7如何隐藏文件与查看隐藏文件

隐藏&#xff1a; 选定文件&#xff0c;右键——属性&#xff0c;在出现的对话框的最下面【属性】的隐藏前的方框打上【勾】&#xff0c;先点【应用】再点【确定】。 查看&#xff1a; 前面的步骤同我的另一篇文章《Windows7如何使文件显示拓展名》一样。 首先我们打开文件…

ubuntu 查看隐藏文件的两种方法

问题来源&#xff1a; 使用git 命令初始化后&#xff0c;会自动生成.git的文件&#xff0c;该文件是git系统跟踪管理的核心&#xff0c;在ubuntu系统下怎样查看隐藏文件&#xff1f; 解决方案&#xff1a; 方案一&#xff0c;若使用桌面可视化窗口&#xff0c;进入该待显示的…

Linux中隐藏文件与文件夹

这篇面向初学者的文章探讨了在 Linux 中如何在普通视图中隐藏文件和文件夹。图形用户界面和命令行方法都有所涉猎。 有时你需要在 Linux 中隐藏文件。不要误会&#xff0c;我不是指那些你不想让你的家人看到的“特殊文件”。尽管你可以隐藏这些特殊文件&#xff0c;但更好的办…

linux查看隐藏文件命令

这本阿里P8撰写的算法笔记&#xff0c;再次推荐给大家&#xff0c;身边不少朋友学完这本书最后加入大厂&#xff1a; Github 疯传&#xff01;史上最强悍&#xff01;阿里大佬「LeetCode刷题手册」开放下载了&#xff01; 一般的Linux下的隐藏目录使用命令ls -l是查看不出来…

Linux下查看隐藏文件命令

一般的Linux下的隐藏目录使用命令ls -l是查看不出来的&#xff0c;只能查看到文件及文件夹 查看Linux下的隐藏文件需要用到命令 ls -al其他查看文件目录命令&#xff1a; ls -lll ls -l /个人网站&#xff1a;http://xudailong.cc 关注「蛇崽网盘教程资源」公众号 &#x…

PDF转HTML格式怎么弄?快来学习下这四个方法

PDF转HTML格式怎么弄&#xff1f;快来学习下这四个方法 https://baijiahao.baidu.com/s?id1770542039444167204&wfrspider&forpc https://baijiahao.baidu.com/s?id1742191502538962207&wfrspider&forpc 如何免费激活GiliSoft Formathor https://www.jb51.n…

密码学学习笔记(十一):哈希函数 - Merkle–Damgård结构

Merkle–Damgrd是一种算法&#xff0c;由Ralph Merkle和Ivan Damgrd提出。它通过迭代调用压缩函数来计算消息的哈希值。 应用 拿SHA-2举例&#xff0c;首先我们需要对需要进行哈希运算的输入做填充&#xff0c;然后将填充后的输入划分为等长的分组&#xff0c;每个分组的长度…

[VRFC 10-529]concurrent assignment to a non-net fir_out_data is not permitted.

问题原因&#xff1a;例化模块时&#xff0c;模块的输出信号设为reg. 解决方法&#xff1a;将模块输出信号改为wire.