2012-12-06 9 views
8
#!/bin/bash 
#gedit tidy plugin 
init=false 
SRC_DIR=~/repos 

DIRECTORY="Gedit-Clientside-Plugin" 
#making repos directory 
if [ ! -d "$SRC_DIR" ]; then mkdir $SRC_DIR; fi 



if [ ! -d "$SRC_DIR/$DIRECTORY" ]; then 
    init=true 
    cd $SRC_DIR && pwd && git clone git://github.com/trentrichardson/Gedit-Clientside-Plugin.git && cd $DIRECTORY 
else 
    cd $SRC_DIR/$DIRECTORY 
fi 
#below here is what I'm having trouble with 
git pull 1>&1 | grep "Already up-to-date." 

if [[ ! $? -eq 0 && ! $init ]]; then 
    read -e -p "## Branch moved, build and install Gedit-Clientside-Plugin? [Y/n] " yn 
    if [[ $yn == "y" || $yn == "Y" || $yn == "" ]] ; then 
     if [ ! -d "/usr/share/gedit/plugins/clientside" ]; then 
      sudo cp ~/repos/Gedit-Clientside-Plugin/clientside /usr/share/gedit/plugins/ -r 
     else 
      echo "Directory already exists." 
     fi 
    fi 
fi 

Il codice precedente è qualcosa che ho modificato da uno script che ho trovato su stackoverflow per installare Emacs dal repository git. Quello che voglio che questo script faccia è installare qualsiasi programma da repository git e aggiornarli se è necessario un aggiornamento. Ovviamente dovrò fornire i passaggi per installarlo. Nel caso di questo script, è sufficiente copiare la directory clientside nella directory /usr/share/gedit/plugins/.Come scrivere uno script di shell che controlla se il repository git è aggiornato?

Non ho bisogno di aiuto su come installare qualsiasi script ma quello di cui ho bisogno è come verificare se il repository è aggiornato e passare da lì.

In questo momento quello che non capisco è questa parte:

git pull 1>&1 | grep "Already up-to-date." 

    if [[ ! $? -eq 0 && ! $init ]]; then 
..... 
    fi 

Quando eseguo git pull 1>&1 | grep "Already up-to-date." && $? nel terminale di uscita è Already up-to-date. 0. Quindi capisco che questa è la parte che controlla gli aggiornamenti, tuttavia la parte successiva non viene eseguita (l'istruzione if) - che è la parte che copia la directory nella directory del plugin gedit. Non capisco cosa significa 1>$1 o cosa significa $?. Quindi non ho potuto risolvere il problema ... E quello che non capisco è il motivo per cui pensa che sia Branch is moved quando non è aggiornato (sto solo supponendo che dice che quando git pull non restituisce 0 nella dichiarazione if).

Sono sicuro che ha una soluzione semplice e la risposta sarà sia educare per bash e git. Apprezzo tutto l'aiuto.

Sto usando Ubuntu 12.04.

+1

'1> & 1' è strano, non ne ho idea; reindirizza lo stdout allo stdout. Di solito lo si vede nel formato '2> & 1', che reindirizza stderr (2) in stdout (1). '$?' è l'ultimo codice di uscita; sarà '0' se' grep' corrisponde a qualcosa, non '' 0' se non riesce a corrispondere (o ha riscontrato un altro errore, come l'accesso al file inesistente). – Amadan

+1

Quindi immagino che '1> & 1' sia totalmente inutile ... non farebbe differenza se fosse lì o no. – Logan

risposta

11

avrei preferito utilizzare la soluzione di "git: check if pull needed ":

git fetch origin 
reslog=$(git log HEAD..origin/master --oneline) 
if [[ "${reslog}" != "" ]] ; then 
    git merge origin/master # completing the pull 
    ... 
5

Come già notato da VonC, questa domanda si sovrappone" git: check if pull needed".

There ho suggerito il seguente script di una sola riga che prende lo SHA1 dell'ultima versione commited e lo confronta con quello di origine remota

[ `git log --pretty=%H ...refs/heads/master^` = `git ls-remote origin 
-h refs/heads/master |cut -f1` ] && echo "up to date" || echo "not up to date" 
+1

Alternativa interessante. +1 – VonC

5

ho dovuto modificare la risposta di Claudio

[ "`git log --pretty=%H ...refs/heads/master^ | head -n 1`" = "`git ls-remote origin -h refs/heads/master |cut -f1`" ] && echo "up to date" || echo "not up to date" 
+1

grazie per questo! ho preso questo semplice one-liner e lo ho inserito in un piccolo script di controllo check_mk: https://github.com/MaxWinterstein/check_git_pullstatus – Max

Problemi correlati