script bash para clonar / extraer repository git masivo

Tengo varios (22) repositorys privados en gitlab con protocolo https y quiero verificar todos los repositorys que proporcionan nombre de usuario y contraseña una vez desde el script bash. Pero parece que no puede hacer que funcione. Aquí está lo lejos que conseguí: (cualquier edición / optimization es muy apreciada):

 #!/bin/bash read -p "gitlab username: " user read -sp "gitlab password: " pass echo read -p "branch to checkout: " branch echo repo[0]='.' #dir repo[1]='repo.myhost.com/project/app.git' #repo url repo[2]='plugins' repo[3]='repo.myhost.com/project/app-core.git' repo[4]='plugins' repo[5]='repo.myhost.com/project/plugin1.git' repo[6]='plugins' repo[7]='repo.myhost.com/project/plugin2.git' repo[8]='api-plugins' repo[9]='repo.myhost.com/project/api-plugin1.git' repo[10]='api-plugins' repo[11]='repo.myhost.com/project/api-plugin2.git' # will add more repo total=${#repo[*]} echo "checking out repositories..." mkdir -p plugins mkdir -p api-plugins for (( i=0; i<${total}; i+=2 )); do dir=${repo[$i]} trepo="https://$user:$pass@${repo[$i+1]}" echo "checking out ${repo[$i+1]} to directory $dir"... if cd $dir; then git pull; else git clone -b branch --single-branch $trepo $dir; fi echo done 

Editar: My git pull no proporciona ninguna contraseña, no sé cómo hacerlo. También mi contraseña contiene @ en ella.

El resultado de este script: pedir el nombre de usuario / pasar de nuevo

 mamun@linux ~/dev/projects $ ./checkout.sh git username: myuser git password: project branch: master checking out repositories... checking out repo.myhost.com/project/app.git to directory .... Username for 'https://repo.myhost.com': ^C 

Como se mencionó, una contraseña con @ debe estar codificada en porcentaje (como menciono aquí ).
En pure bash, ve esta function, por ejemplo .

Prueba en tu misma canción esos commands:

 echo git ls-remote http://${user}:${pass}@repo.myhost.com/project/app.git git ls-remote http://${user}:${pass}@repo.myhost.com/project/app.git 

El ls-remote consultará las twigs de repos remoto, sin tirar o clonar: esto es solo para probar.

El OP Mamun Sardar confirma en los comentarios el problema de encoding y agrega:

También cometí un error debería usar: git clone -b $branch lugar de git clone -b branch

Estoy de acuerdo y recomendaría:

Una solución fácil sería usar el protocolo SSH con la key SSH. Si la key tiene una frase de contraseña, puede usar ssh-agent.

Si está atrapado con HTTP (S), git proporciona un mecanismo para dar el nombre de usuario y la contraseña sin ponerlos en la URL: GIT_ASKPASS

GIT_ASKPASS es un env-var que apunta a un script que toma un argumento: el aviso ("Nombre de usuario para …" o "Contraseña para …") y emite el valor solicitado.
Entonces una solución es:

 GIT_ASKPASS=$(mktemp) cat <<EOF > ${GIT_ASKPASS} #!/bin/sh case "\$1" in Username*) echo '${user}' ;; Password*) echo '${pass}' ;; esac EOF chmod +x ${GIT_ASKPASS} # Put here all your git calls that need cnetworkingentials rm -f ${GIT_ASKPASS}