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.https
url
cloning int reposity...
Preparação
git
Configuraçõ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 mxnet
o warehouse como exemplo, se você usar https
o 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 https
protocolo 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 .url
ssh
git clone [email protected]:apache/mxnet.git
ssh
ssh
Problema 2: Ficar preso ao extrair submódulos
A razão pela qual a extração de submódulos está travada é porque https
o link do warehouse do protocolo é usado na configuração do warehouse original para pull. Para resolver o problema, você só precisa alterar todos .gitmodules
os 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:url
ssh
url
https:://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 mxnet
como exemplo:
mxnet
Primeiro, você precisa baixar os módulos que não contêm submódulos . Observe que você precisassh
usar o comando para puxar:git clone [email protected]:apache/mxnet.git
;- Digite o caminho do warehouse. Neste momento,
mxnet
um 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 comoget_submodules_recursive
; - Execute o script acima e aguarde a conclusão da extração do submódulo. Você deve usar o comando
bash
para executá-lo. Se o comando esh
não for suportado , ocorrerá um erro, ou seja, execute-o através do comando.pushd
popd
bash get_submodules_recursive
O efeito de execução é mostrado abaixo:
Você pode ver que o submódulo pode ser extraído com sucesso neste momento. Neste momento, git status
novas modificações serão exibidas porque .gitsubmodules
o 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 restore
Basta 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 url
protocolo 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 --recursive
toda vez que ele é extraído ..gitmodles
url