2012-12-05 20 views
6

Sto scrivendo una sceneggiatura per automatizzare la creazione di nuovi progetti per me.Catturare l'output dal comando git?

questo include la rimozione di un repository github.

Quello che voglio fare è avere un po 'di uscita dal mio script, quindi chiamare git clone $repo

voglio mostrare l'output di questo comando mentre è in esecuzione, ma poi quando si è eseguito se è stato eseguito correttamente sostituire è in uscita (si noti solo l'output dei comandi git, voglio ancora l'output di prima che sia lì) con repository successfully cloned e, in caso di errore, lasciare lì l'output e stampare repository cloning failed.

Come posso fare questo?

Di seguito è il mio script corrente (piuttosto semplice).

#! /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 

risposta

10

git clone fornisce un codice di uscita che è possibile leggere con $? come segue:

git clone [email protected]:repo 
echo $? 

Questo stamperà 0 se tutto ha funzionato bene. Se ad esempio la cartella non è un repository git si otterrà il codice di uscita 128.

è possibile controllare se il clone ha funzionato come segue:

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

--quiet sarà sopprimere qualsiasi uscita da Git, a patto che non ci sono errori Quindi, se rimuovi solo il ramo else, otterrai risultato positivo o l'errore prodotto da git.

+0

Ho modificato la parte inferiore dello script come 'git clone $ templateurl $ project --quiet success = $? se [[successo -eq 0]]; quindi echo "Repository clonato con successo." fi' Ma sto ricevendo l'errore '[[: non trovato' sulla riga con l'istruzione if. inoltre, penso che la mia domanda sia leggermente incomprensibile, voglio comunque visualizzare l'output normale mentre il comando è in esecuzione, in modo che l'utente riceva un feedback su ciò che sta accadendo. ma voglio cancellare quell'output una volta che il comando è finito. – Hailwood

+0

C'è un $ mancante nell'istruzione if: '[[$ successo ...;' Se si desidera eliminare l'output già stampato, si dovrà trattare del ritorno a capo (\ r) e quindi sovrascrivere il vecchio output. Suppongo che l'eliminazione dell'output già stampato non sia possibile. – sge

+0

Un'altra possibilità sarebbe usare ANSI-Escape-Codes http://ascii-table.com/ansi-escape-sequences.php. es. "echo -e" \ 033 [2K "' rimuove la linea attiva.Una combinazione di impostare la posizione del cursore e rimuovere le linee potrebbe portare al successo. – 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 

Spiegazione:

git clone [email protected]:repo localrepo > git.log 2>&1 Reindirizza flussi stdout e stderr a git.log. > git.log reindirizza stdout su git.log 2>&1 reindirizza lo stderr nello stesso punto di stdout (quindi git.log).

$? eq 0 Controlla il retcode di git che dovrebbe essere 0 se il clone ha avuto successo.

cat git.log restituisce il contenuto del file git.log.

+0

'GITOUTPUT = \' git clone utente @ server: repo localrepo \ '', purtroppo, non sopprimerà l'output di git. Anche 'git clone ...>/dev/null' non sopprime alcun output. – sge

+1

Quindi deve scrivere su stderr. Posterò una risposta diversa – antik

+1

git checkout va anche a stderr (ma git pull va allo stdout?). Questo mi ha salvato! – rob5408

Problemi correlati