2012-12-30 8 views
6

Ich wollte ein Skript erstellen, das alle meine GitHub-Repositorys aktualisieren würde.Warum funktioniert mein Git Auto-Update Script nicht?

Ich würde nur meinen Benutzernamen und mein Passwort eingeben müssen, und das Skript würde eine Liste von Repositories durchlaufen, rufen Sie git push und stellen Sie die erforderlichen Informationen über eine zusätzliche Expect-Skript.

Dies ist mein Bash-Skript:

#! /bin/bash 

echo "Updating GitHub projects from project_list.txt." 
echo 

read -p "GitHub username: " un 
read -p "GitHub password: " -s pw 

echo 
echo 

while read line 
do 
    eval dir=$line 
    echo "Updating:" $dir"." 
    cd $dir 
    $SF/githubexpect $un $pw 
    echo 
    echo 
done < $SF/project_list.txt 

$SF ist eine globale Umgebungsvariable, die einen absoluten Pfad zu meinem Skript-Ordner enthält. Hier

ist das githubexpect Skript:

#! /usr/bin/expect 

set un [lindex $argv 0] 
set pw [lindex $argv 1] 

spawn git push 

expect "Username" 
send $un\n 

expect "Password" 
send $pw\n 

Wenn ich die Bash-Skript laufen, Dinge wie erwartet gehen.

  1. Ich bin aufgefordert, die Info.
  2. Das Skript wird erfolgreich gestartet und liest weiterhin die Datei project_list.txt.
  3. Sobald es sich im Verzeichnis des Repositorys befindet, ruft es das Githubexpect-Skript auf und gibt korrekt über die Info weiter (ich habe das getestet).
  4. githubexpect gibt korrekt an git push.
  5. Es wird aufgefordert, die Eingabe (ich sah dies in der Konsole).
  6. Es stellt meine Informationen zur Verfügung (wieder sah ich das auch).
  7. Dann geht es einfach weiter zum nächsten Repository, als wäre nichts passiert. < - Fehler!

ich den Verdacht, dass das githubexpect Skript könnte in ausgeführt wird git push relativ zu sich selbst, und nicht das Verzeichnis werden Laichen, das aktuelle Skript so git finden nicht einmal ein Repository. Das ist wahrscheinlich falsch, da mein Skriptordner, in dem sich githubexpect befindet, auch ein Repository ist.

Antwort

10

Sie sollten \r anstelle von \n senden. Das eigentliche Problem ist jedoch, dass Sie nicht auf git push warten. Fügen Sie dies als letzte Zeile des erwarteten Skripts hinzu

expect eof 
+0

Es funktioniert jetzt! Würde es Ihnen etwas ausmachen zu erklären, warum Programme 'eof' zurückgeben, wenn sie fertig sind? Vielen Dank. – corazza

+0

Das scheint wie eine ausgezeichnete Frage SO :) – jarodeells

+0

Es ist nicht unbedingt, dass das Programm eof zurückgibt: das erzeugte Programm beendet, und Expect verwendet das Schlüsselwort "eof" für diese Bedingung. –