
Die Idee hier ist, Remotes in allen Git-Repositories von http auf ssh umzustellen
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`}"
Ich möchte alle meine (daher Benutzername in Perl-Regex) Repositories finden und sie so umstellen, dass sie SSH statt HTTP verwenden. Ich habe das Perl-Skript getestet, es funktioniert einwandfrei, aber wenn ich es in einem Befehl verwende, gibt es Folgendes aus:
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
Antwort1
Ich bin nicht ganz sicher, was Sie wollen (was der genaue erwartete Befehl ist), aber dies:
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"}'
sollte drucken
git remote remove https://github.com/username/reponame.git && git remote add https://github.com/username/reponame.git [email protected]:username/
(Ändern Sie das print
in system
, wenn Sie sicher sind, dass Sie die Befehle ausführen möchten.)
Ich habe die for r in xyz
Eingabe der URLs in Perls Standardeingabe geändert. Wenn Sie sie auf der Kommandozeile eingeben möchten, können Sie Folgendes tun:
perl -le '$_=shift; if (m#http://(.*?)/(.*/)#) {print "blah $_ $1:$2"}' http://foo.bar/user/something
um das Befehlszeilenargument zu löschen $_
(das implizit von verwendet wird, m//
sofern Sie nicht mit etwas anderes angeben $var =~ m//
).
Außerdem ist es besser, das @
in der Zeichenfolge zu maskieren, da es das Siegel für eine Array-Variable ist.