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

这篇具有很好参考价值的文章主要介绍了解决github无法拉取submodule子模块的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

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

前置准备

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

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

mxnet的仓库为例,如果使用https协议进行克隆,即通过命令git clone 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/bash

pull_submodule_recursive()
{
    if [ -f ".gitmodules" ];then
        echo ".gitmodules found"
        # backup
        cp .gitmodules .gitmodules.bak
        while read line
        do
            # substitude the https with ssh
            echo ${line} | sed 's/https:\/\/github.com\//git@github.com:/g' >> .new_gitmodules
        done < .gitmodules
        mv .new_gitmodules .gitmodules
        # pull current submodules
        git submodule init
        git submodule sync
        git submodule update
        # get the directories of current submodules
        local directories=$(cat .gitmodules | grep path | awk '{print $3}')
        for directory in $directories
        do
            if [ -d $directory ];then
                # enter the directory
                pushd ${directory} > /dev/null
                # pull one submodule and its submodules
                pull_submodule_recursive
                # return to the last working directory
                popd > /dev/null
            fi
        done
    else
        echo "current submodule has no submodule, return to last directory..."
    fi
    return 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进行执行。

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

代码逻辑解释

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

可悲

到了这里,关于解决github无法拉取submodule子模块的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git submodule 子模块的基本使用

    命令 说明 git submodule add url 本地路径 添加子模块 git submodule update --init --recursive 添加子模块后,同步子模块内容 git clone url --recurse-submodules 克隆带有子模块的项目 git submodule init 初始化子模块 git submodule update 更新子模块 git submodule sync --recursive 子模块地址变更 git submodule dein

    2024年02月09日
    浏览(40)
  • 如何使用 git submodule 删除子模块?

    删除 Git 子模块(submodule)需要进行一系列的步骤。下面是如何做的详细步骤: 从 .gitmodules 文件中删除子模块的相关条目。 请将 submodule_name 替换为您要删除的子模块的名称。 从 .git/config 文件中删除子模块的相关条目。 同样地,将 submodule_name 替换为您要删除的子模块的名称

    2024年02月10日
    浏览(64)
  • git 删除 submodule 子模块的步骤

    实验有效,这里删除了两个 submodule。 验证方法,当重新git clone 项目(先不加 --recursive 选项)后,   之后, ls .git/module 文件夹已经不存在 XXXX/ 与 YYYY/ 文件夹也不存在 这是就可以merge 进 master 中了。   其中,如果项目只有一个submodule,那么,删除 submodule 后,.gitmodules 中的

    2024年01月19日
    浏览(64)
  • 【Git】在Git项目中添加子模块项目 - submodule

    先clone a-project项目到本地。 进入你想添加b-project到a-project的目录,使用git命令添加子模块。 提交子模块到远程仓库 拉取/clone带有子模块的Git项目,直接拉取后子项目中可能没有任何内容,需要进行子模块初始化同步设置后,才能拉取完整的Git项目。 进入子模块目录 查看子

    2024年02月13日
    浏览(78)
  • Git系列文章目录 - Git 子模块git submodule使用

    项目中有时会遇到会涉及子模块的使用,比如 flatpak 项目包含多个子模块。 进入需要添加子模块的目录,一般是项目根目录。 删除子模块目录及源码: 删除项目目录下.gitmodules文件中子模块相关条目: 删除配置项中子模块相关条目: 删除模块下的子模块目录: 清除子模块

    2024年01月20日
    浏览(66)
  • Docker使用阿里云拉取配置源也无法拉取的镜像-github镜像镜像gcr.io

    对于大部分镜像来说,我们配置源就可以,但是对于较新的镜像,没得搞啊,铁子们,真的崩溃… 最终发现可以通过Aliyun的自动构建来处理被墙镜像。 docker-images 今天就写到这里啦~ 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~ 大家要天天开心哦 欢迎大家指出文

    2024年02月12日
    浏览(61)
  • Git在已有的项目中引入Submodule子模块管理:添加、更新、删除(实战示例代码)

    在进行Git版本控制的过程中,有时候我们需要在已有的项目中引入子模块,以便复用其他独立的Git存储库的代码或文件。本文将详细介绍如何在已有项目下添加、更新和删除Git的Submodule子模块,并提供相关的示例代码。 假设我们已经有一个主项目(my-main-project)的Git存储库,

    2024年02月07日
    浏览(48)
  • Docker无法拉取镜像解决方案

    安装docker之后,有时候我们拉取镜像会出现速度慢,或者不成功 报错代码:   原因: 在等待报头时超时,请求在等待连接时被取消(客户端)。Docker 默认的源为国外官方源,下载速度较慢,可改为国内镜像源。 解决办法: 使用阿里云镜像加速器 1.打开网址阿里云登录 - 欢迎

    2024年02月13日
    浏览(72)
  • ubuntu 替换清华源后不能更新报错,无法拉取 https 源解决

    Ubuntu 替换清华源后 sudo apt-get update 报错 Error: Certificate verification failed . The certificate is NOT trusted. E: The repository ‘https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic Release’ does not have a Release file. 1.安装 certificates 证书 2.因为默认的源是 http 的,但是准备使用的镜像源是 https 的,所以需要额

    2024年02月07日
    浏览(45)
  • git submodule update --init 失败解决办法

    我们在github上寻找开源项目的源码,clone下来研究的时候,由于项目需要多个开源项目的支持,所有还需要二次clone子工程的源码支持,比如最近在使用: grpc 在clone子模块的时候会出现失败或无法访问的情况,其原因众所周知无非就是有些东西需要科学上网 找到项目的.gitmodul

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包