2012-12-06 8 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 

Powyższy kod jest czymś, co edytowałem ze skryptu, który znalazłem na stackoverflow, aby zainstalować Emacsa z repozytorium git. Chcę, aby ten skrypt instalował dowolne programy z repozytoriów git i aktualizował je, jeśli konieczna jest aktualizacja. Oczywiście będę musiał podać kroki, aby go zainstalować. W przypadku tego skryptu wystarczy skopiować katalog clientside do katalogu /usr/share/gedit/plugins/.Jak napisać skrypt powłoki, który sprawdza, czy repozytorium git jest aktualne?

Nie potrzebuję pomocy w instalacji jakiegokolwiek skryptu, ale potrzebuję go, aby sprawdzić, czy repozytorium jest aktualne i przejść z tego miejsca.

Teraz co nie rozumiem jest to część:

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

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

Kiedy biegnę git pull 1>&1 | grep "Already up-to-date." && $? w terminalu wyjście jest Already up-to-date. 0. Rozumiem, że jest to część, która sprawdza dostępność aktualizacji, jednak kolejna część nie jest wykonywana (instrukcja if) - która jest częścią, która kopiuje katalog do katalogu wtyczki gedit. Nie rozumiem, co znaczy 1>$1 lub co oznacza. Dlatego nie mogłem rozwiązać problemu ... I nie rozumiem, dlaczego uważa, że ​​Branch is moved, gdy nie jest on aktualny (po prostu zakładam, że mówi, że gdy git pull nie zwraca 0 w instrukcji if).

Jestem pewien, że ma proste rozwiązanie, a odpowiedź będzie zarówno edukacją dla basha, jak i gita. Doceniam wszelką pomoc.

Używam ubuntu 12.04.

+1

'1> & 1' jest dziwne, nie mam pojęcia; przekierowuje stdout na stdout. Zwykle widać to w formularzu '2> & 1', który przekierowuje stderr (2) na standardowe wyjście (1). '$?' jest ostatnim kodem wyjścia; będzie "0", jeśli "grep" pasuje do czegoś, bez "0", jeśli nie pasuje (lub wystąpił inny błąd, np. dostęp do nieistniejącego pliku). – Amadan

+1

Zgaduję więc, że '1> i 1' jest całkowicie bezcelowe ... nie zrobiłoby różnicy, gdyby było tam, czy nie. – Logan

Odpowiedz

11

wolałbym użyć roztworu "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

Jak już zauważony przez Vonc kwestia ta zachodzi" git: check if pull needed".

There Zasugerowałem następujący skrypt jeden wiersz, który zaczyna się SHA1 od ostatniej wersji zaangażowani i porównuje go do jednego zdalnego pochodzenia

[ `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

Interesująca alternatywa. +1 – VonC

5

musiałem zmieniać odpowiedź Claudio za

[ "`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

dzięki za to! Wziąłem tę prostą jedną linijkę i wrzuciłem ją do jakiegoś małego skryptu monitorującego check_mk: https://github.com/MaxWinterstein/check_git_pullstatus – Max

Powiązane problemy