我在gitlab
上使用https
协议有几个(22)私有存储库,我想从bash脚本中检出所有提供用户名和密码的存储库。但似乎无法使其发挥作用。这是我有多远:(非常感谢任何编辑/优化):
#!/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
修改
我的git pull
没有提供任何密码,也不知道如何操作。此外,我的密码中包含@
。
此脚本的结果:再次询问用户名/通行证
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
答案 0 :(得分:0)
如上所述,@
的密码必须为百分比编码(因为我mention here)
在纯粹的bash中,请参阅此function for instance。
尝试使用相同的bash命令:
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
ls-remote将查询远程repo分支,无需拉动或克隆:这仅用于测试。
OP Mamun Sardar确认in the comments编码问题并添加:
我也犯了一个错误:
git clone -b $branch
而不是git clone -b branch
我同意并建议:
${branch}
代替$branch
。答案 1 :(得分:0)
一个简单的解决方案是使用SSH协议和SSH密钥。如果密钥有密码,则可以使用ssh-agent。
如果您遇到HTTP(S),git会提供一种机制来提供用户名和密码,而不会将其放入网址:GIT_ASKPASS
GIT_ASKPASS
是一个env-var,它指向一个带有一个参数的脚本:提示符(“Username for ...”或“Password for ...”)并输出提示值。 />
所以解决方案是:
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 credentials
rm -f ${GIT_ASKPASS}