2012-12-05 9 views
6

Ich schreibe ein Skript, um die Einrichtung neuer Projekte für mich zu automatisieren.Capture-Ausgabe von Git-Befehl?

Dazu gehört das Herunterziehen eines GitHub-Repository.

Was ich tun möchte, ist eine Ausgabe von meinem Skript haben, dann rufen Sie git clone $repo

Ich möchte von diesem Befehl die Ausgabe zeigen, während es läuft, aber dann, wenn es ausgeführt hat, wenn es erfolgreich ausgeführt ersetzen es ist Ausgabe (beachten Sie nur die Git-Befehle Ausgabe, ich möchte immer noch die Ausgabe von vor, um dort zu sein) mit repository successfully cloned und wenn fehlgeschlagen lassen Sie einfach die Ausgabe dort, und drucken repository cloning failed.

Wie kann ich das tun?

Unten ist meine aktuelle (eher einfache) Skript.

#! /bin/bash 

# -p project name 

templateurl="[email protected]:xxx/xxx-site-template.git" 

while getopts ":p:" opt; do #eventually I'll add more options here 

case $opt in 
    p) 
    project=$OPTARG 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

if [ -z "$project" ]; then 
    echo "Project name required" 
    exit 1 
fi 

clear 
echo "|==========================|" 
echo "| New xxx Project Creator |" 
echo "|==========================|" 
echo "Project: $project" 

if [ -d "$project" ]; then 
    echo "Directory $project already exists!" 
    exit 1 
fi 


mkdir $project 
if [ ! -d "$project" ]; then 
    echo "Failed to create project directory!" 
    exit 1 
fi 

echo "Cloning xxx Template repository" 
git clone $templateurl $project 

Antwort

10

git clone tut bieten einen Exit-Code Sie mit $ lesen kann? wie folgt:

git clone [email protected]:repo 
echo $? 

Dies wird 0 drucken, wenn alles gut geklappt hat. Wenn beispielsweise der Ordner nicht ein Git Repository ist, werden Sie den Exit-Code erhalten 128

Sie überprüfen können, ob der Klon wie folgt gearbeitet:

git clone [email protected]:repo localrepo --quiet 
success=$? 
if [[ $success -eq 0 ]]; 
then 
    echo "Repository successfully cloned." 
else 
    echo "Something went wrong!" 
fi 

--quiet wird jede Ausgabe von git unterdrücken, solange Es gibt keine Fehler. Wenn Sie also einfach den else-Zweig entfernen, erhalten Sie eine positive Ausgabe oder den von git erzeugten Fehler.

+0

Ich habe den unteren Teil des Skripts geändert, um 'git clone $ templateurl $ project --quiet Erfolg = $? wenn [[Erfolg -eq 0]]; dann echo "Repository erfolgreich geklont." fi' Aber ich bekomme den Fehler "[[: nicht gefunden" in der Zeile mit der if-Anweisung. Außerdem denke ich, meine Frage ist etwas missverstanden, ich möchte immer noch die normale Ausgabe anzeigen, während der Befehl läuft, so dass der Benutzer ein Feedback darüber bekommt, was vor sich geht. aber ich möchte diese Ausgabe löschen, sobald der Befehl beendet ist. – Hailwood

+0

In der if-Anweisung fehlt ein $: '[[$ success ...;' Wenn Sie bereits gedruckte Ausgaben löschen wollen, müssen Sie mit Wagenrücklauf (\ r) umgehen und dann die alte Ausgabe überschreiben. Ich nehme an, dass das Löschen bereits gedruckter Ausgaben nicht möglich ist. – sge

+0

Eine andere Möglichkeit wäre die Verwendung von ANSI-Escape-Codes http://ascii-table.com/ansi-escape-sequences.php. zB 'echo -e" \ 033 [2K "' entfernt die aktive Zeile.Eine Kombination aus dem Setzen der Cursorposition und dem Entfernen von Zeilen könnte zum Erfolg führen. – sge

4
git clone [email protected]:repo localrepo > git.log 2>&1 
if [[ $? eq 0 ]]; 
then 
    echo Repository successfully cloned. 
else 
    cat git.log 
    echo Repository cloning failed. 
fi 

rm git.log 

Erläuterung:

git clone [email protected]:repo localrepo > git.log 2>&1 Leitet stdout und stderr Streams git.log. > git.log leitet stdout an git.log um 2>&1 leitet stderr an dieselbe Stelle wie stdout (also git.log) um.

$? eq 0 Prüft den retcode von Git, der 0 sein sollte, wenn der Klon erfolgreich war.

cat git.log gibt den Inhalt der Datei git.log aus.

+0

'GITOUTPUT = \\ Git Klon Benutzer @ Server: Repo localrepo \' 'wird leider nicht die Ausgabe von git unterdrücken. Sogar 'git clone ...>/dev/null' unterdrückt keine Ausgabe. – sge

+1

Es muss dann zu stderr schreiben. Ich werde eine andere Antwort posten. – antik

+1

git checkout geht auch an stderr (aber git pull geht an stdout?). Das hat mich gerettet! – rob5408