Resolva o problema de que o github não pode extrair submódulo submódulo

introdução

Ao usar git clone --recursive url pull um repositório configurado com submódulos, ele ficará travado. Ao mesmo tempo, ao
usar git clone pull , você também pode ficar preso.Este artigo fornece um script simples para resolver o problema.httpsurlcloning int reposity...

Preparação

gitConfigurações relacionadas que precisam ser configuradas , git user.name, git user.email, ssh.

Problema 1: travar ao usar git clone para extrair o repositório do protocolo https

Tomando mxneto warehouse como exemplo, se você usar httpso protocolo para clonar, ou seja, por meio de comandos https://github.com/apache/mxnet.git, poderá ficar preso cloning into mxnet.... Na verdade, a solução é muito simples. Basta alterar o httpsprotocolo acima para o protocolo. Mesmo se você usar o comando, ele não travará. Porém, o princípio não está muito claro no momento. Nota: Mesmo que utilize a clonagem do armazém, são necessárias medidas extraordinárias. A configuração também é necessária .urlsshgit clone [email protected]:apache/mxnet.git
sshssh

Problema 2: Ficar preso ao extrair submódulos

A razão pela qual a extração de submódulos está travada é porque httpso link do warehouse do protocolo é usado na configuração do warehouse original para pull. Para resolver o problema, você só precisa alterar todos .gitmodulesos submódulos nos arquivos do warehouse para protocolos para pull. . Para modificar, você só precisa substituir os que estão em , mas é mais problemático modificar manualmente, pois após a modificação, é preciso considerar que os submódulos puxados também dependerão de outros submódulos. Neste momento, você ainda precisa modificar, então simplesmente escrevi um script. Isso é conseguido por meio de recursão. código mostrado abaixo:urlssh
urlhttps:://github.com/[email protected]:

#!/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\//[email protected]:/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

Como usar o script, tome o pull mxnetcomo exemplo:

  • mxnetPrimeiro, você precisa baixar os módulos que não contêm submódulos . Observe que você precisa sshusar o comando para puxar: git clone [email protected]:apache/mxnet.git;
  • Digite o caminho do warehouse. Neste momento, mxnetum diretório aparecerá no diretório atual. Você só precisa inserir o diretório, criar um arquivo e copiar o código acima para o arquivo. Aqui definimos o nome como get_submodules_recursive;
  • Execute o script acima e aguarde a conclusão da extração do submódulo. Você deve usar o comando bashpara executá-lo. Se o comando e shnão for suportado , ocorrerá um erro, ou seja, execute-o através do comando.pushdpopdbash get_submodules_recursive

O efeito de execução é mostrado abaixo:
Insira a descrição da imagem aqui
Você pode ver que o submódulo pode ser extraído com sucesso neste momento. Neste momento, git statusnovas modificações serão exibidas porque .gitsubmoduleso arquivo foi modificado. No entanto, isso não é um grande problema. Se você Se você sentir que não deseja modificá-lo, basta seguir as instruções para passá-lo. git restoreBasta restaurar o comando

Explicação da lógica do código

O código procurará arquivos no diretório atual .gitmodules. Somente quando o arquivo modificado for encontrado ele continuará a execução. Quando o arquivo modificado for encontrado, o submódulo no arquivo modificado será alterado para o urlprotocolo ssh. Após a conclusão da alteração, o O submódulo será extraído. Em seguida, insira cada submódulo para verificar se o submódulo possui algum submódulo... O código continuará repetindo a lógica acima até que todos os submódulos tenham sido extraídos.
Ou seja, a lógica e a consistência da execução do código só precisam ser modificadas git clone --recursivetoda vez que ele é extraído ..gitmodlesurl

triste

Acho que você gosta

Origin blog.csdn.net/qq_45523675/article/details/131661935
Recomendado
Clasificación