2012-12-05 26 views
6

Piszę skrypt, aby zautomatyzować tworzenie nowych projektów dla mnie.Przechwytywanie danych wyjściowych z polecenia git?

obejmuje to ściągnięcie repozytorium github.

Co chcę zrobić, to mieć jakieś wyjście z mojego skryptu, a następnie zadzwonić git clone $repo

chcę pokazać wyjście z tego polecenia, gdy jest uruchomiony, ale wtedy, gdy prowadzi, jeśli prowadzi z powodzeniem zastąpić to jest wyjście (zwróć uwagę tylko na polecenia polecenia git, nadal chcę, aby dane wyjściowe przed nim były) z repository successfully cloned, a jeśli się to nie uda, zostaw to wyjście i wydrukuj repository cloning failed.

Jak mogę to zrobić?

Poniżej znajduje się mój obecny (raczej prosty) skrypt.

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

Odpowiedz

10

git clone zapewnia kod wyjścia, który można odczytać za pomocą $? w następujący sposób:

git clone [email protected]:repo 
echo $? 

Spowoduje to wydrukowanie 0, jeśli wszystko działało poprawnie. Jeśli na przykład folder nie jest repozytorium git dostaniesz kod wyjścia 128.

można sprawdzić, czy klon pracował w następujący sposób:

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

--quiet będzie tłumić wszelkie dane wyjściowe z git, tak długo, jak nie ma błędów. Więc jeśli po prostu usuniesz gałąź innego, otrzymasz pozytywny wynik lub błąd wygenerowany przez git.

+0

Zmieniono dolną część skryptu na "git clone $ templateurl $ project --quiet success = $? , jeśli [[success -quq 0]]; następnie echo "Repozytorium pomyślnie sklonowane." fi' Ale pojawia się błąd '[[: not found' w wierszu z instrukcją if. także, myślę, że moje pytanie jest nieco niedopowiedziane, nadal chcę wyświetlać normalny wynik, ponieważ polecenie jest uruchomione, więc użytkownik otrzymuje pewne informacje zwrotne na temat tego, co się dzieje. ale chcę usunąć ten wynik po zakończeniu polecenia. – Hailwood

+0

W instrukcji if jest $ brak: '[[$ success ...;' Jeśli chcesz usunąć już wydrukowane dane wyjściowe, będziesz musiał postępować z powrotem karetki (\ r), a następnie nadpisać stare dane wyjściowe. Zakładam, że usunięcie już wydrukowanych danych nie jest możliwe. – sge

+0

Inną możliwością byłoby użycie ANSI-Escape-Codes http://ascii-table.com/ansi-escape-sequences.php. np. 'echo -e" \ 033 [2K "' usuwa aktywną linię.Połączenie ustawienia pozycji kursora i usunięcia linii może doprowadzić do sukcesu. – 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 

Objaśnienie:

git clone [email protected]:repo localrepo > git.log 2>&1 przekierowania StdOut i StdErr strumieni do git.log. > git.log przekierowuje stdout do git.log 2>&1 przekierowuje stderr do tego samego miejsca co stdout (stąd git.log).

$? eq 0 Sprawdza kod powrotu git, który powinien wynosić 0, jeśli klon się powiódł.

cat git.log wyprowadza zawartość pliku git.log.

+0

'GITOUTPUT = \' git clone user @ server: repo localrepo \ '' niestety, nie powstrzyma wyjścia git. Nawet 'git clone ...>/dev/null' nie tłumi żadnych wyników. – sge

+1

To musi być pisanie do stderr następnie. Opublikuję inną odpowiedź. – antik

+1

git checkout również przechodzi do stderr (ale git pull idzie na standardowe wyjście?). To mnie uratowało! – rob5408