2017-09-12 28 views
1

私はgitlabhttpsプロトコルでいくつかの(22)プライベートレポジトリを持っています。そして、私はbashスクリプトから一度ユーザ名とパスワードを提供するすべてのリポジトリをチェックアウトしたいと思います。しかし、それを機能させるように見えることはできません。 (任意の編集/最適化がはるかに高く評価される):ここで私が得たどのくらいですクローン/プルバルクgitリポジトリの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:[email protected]${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任意のパスワードを提供しない、それを行う方法がわかりません。私のパスワードには@が入っています。

このスクリプトの結果:ユーザ名を尋ねる/再び

[email protected] ~/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

エラーは何ですか? '$ user'や' $ pass'に特殊文字が含まれている場合は、それらを '%'でエンコードしなければなりません。 '@'は '%40'です。 – phd

+0

それはユーザー名とパスワードをもう一度求めています。私は質問を編集させてください。 –

+0

'http:// $ user:$ pass @ repo.myhost.com/project/app.git'をコマンドラインから複製できますか? – phd

答えて

0

述べたように、@とパスワードは、パーセントエンコードされている必要があり渡す(としてI 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-リモートで引っ張ったり、クローニングせずに、リモートレポ枝を照会します:これはただのテストのためです。

OP Mamun Sardarin the commentsエンコーディングの問題を確認し、追加します。

をまた、私は間違いが使うべき作っ:git clone -b $branchの代わりgit clone -b branch

私は同意し、推薦する:

  • $branchの代わりに${branch}を使用してください。
  • SSHキーでSSHプロトコルを使用することですwww.shellcheck.net
+0

ok。私は 'pass =" $ {rawpass // @ /%40} "'を追加して置き換えました。ありがとう。また、間違いを犯しました: 'branch'ではなく' $ branch' –

+0

@MamunSardar素晴らしい!私はより多くの可視性のための答えにあなたのコメントを入れて、あなたのスクリプトを確認するためのリンクを追加しました。 – VonC

0

つの簡単な解決策を使用してスクリプトをチェックします。鍵にパスフレーズがある場合は、ssh-agentを使用できます。あなたは、HTTP(S)で立ち往生している場合は

は、GitはURLでそれらを入れずに、ユーザー名とパスワードを与えるメカニズムを提供します:GIT_ASKPASS

GIT_ASKPASSで取るスクリプトを指すENV-VAR 1つの引数:プロンプト(「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} 
関連する問題