
A ideia aqui é mudar os controles remotos de http para ssh em todos os repositórios git
find / -type d -name '.git' 2>/dev/null | xargs -I {} $SHELL -c \
'cd $(dirname {}) && echo $(pwd) > /tmp/log.log && git remote | \
perl -ne "if (`git config --get remote.$_.url` =~ m#https://(.*)/(username.*)#){`git remote remove $_ && git remote add $_ git\@$1:$2`}"
O que eu quero fazer é encontrar todos os meus repositórios (nome de usuário em perl regex) e trocá-los para usar ssh em vez de http. Eu testei o script perl, ele está funcionando corretamente, mas quando eu o uso no comando ele gera isso
fatal: No such remote: remote syntax error at -e line 1, near "( =~" syntax error at -e line 1, near ";}" Execution of -e aborted due to compilation errors. xargs: /bin/zsh: exited with status 255; aborting
Responder1
Não tenho certeza do que você deseja (qual é o comando exato esperado), mas isto:
printf "%s\n" 'https://github.com/username/reponame.git' \
'[email protected]:username/reponame' | perl -lne \
'if (m#https://(.*?)/(.*/)#) {print "git remote remove $_ && git remote add $_ git\@$1:$2"}'
deveria imprimir
git remote remove https://github.com/username/reponame.git && git remote add https://github.com/username/reponame.git [email protected]:username/
(Altere print
para system
se tiver certeza de que deseja executar os comandos)
Eu mudei for r in xyz
para inserir os URL:s para stdin do Perl, se você quiser fornecê-los na linha de comando, você pode fazer algo como
perl -le '$_=shift; if (m#http://(.*?)/(.*/)#) {print "blah $_ $1:$2"}' http://foo.bar/user/something
para descartar o argumento da linha de comando $_
(que é usado implicitamente, m//
a menos que você especifique outra coisa com $var =~ m//
).
Além disso, é melhor escapar do @
na string, pois é o sigilo de uma variável de array.