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

Yukarıdaki kod, git repository'den Emacs'i yüklemek için stackoverflow üzerinde bulduğum bir komut dosyasından düzenlediğim bir şeydir. Bu betiğin yapmasını istediğim, git reposlarından herhangi bir program yüklemek ve güncelleme gerektiğinde bunları güncellemektir. Elbette onu kurmak için gereken adımları vermem gerekecek. Bu betiğin durumunda, clientside dizinini /usr/share/gedit/plugins/ dizinine kopyalamanız yeterlidir.Git deposunun güncel olup olmadığını kontrol eden bir kabuk komut dosyası nasıl yazılır?

Herhangi bir komut dosyasının nasıl yükleneceği konusunda yardıma ihtiyacım yok, ancak ihtiyacım olan şey, deponun güncel olup olmadığını nasıl kontrol edip oradan nasıl gidileceğini kontrol etmektir. Ben terminalde git pull 1>&1 | grep "Already up-to-date." && $? çalıştırdığınızda

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

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

çıkış Already up-to-date. 0 geçerli:

Şu anda anlamadığım şu bu parçasıdır. Bu yüzden, bunun güncellemeleri kontrol eden bölüm olduğunu anlıyorum, ancak bir sonraki kısımda (if deyimi) - dizini gedit eklenti dizinine kopyalayan bölüm. 1>$1'un ne anlama geldiğini veya $?'un ne anlama geldiğini anlamıyorum. Bu yüzden ben sorunu çözemedim ... Ve ben anlamadım neden o zaman güncel değil (o zamanif deyiminde 0 dönmez olduğunu söylüyor varsayarak olduğunu düşünüyor).

Bunun basit bir çözümü olduğuna eminim ve cevap hem bash hem git için eğitilecek. Tüm yardımı takdir ediyorum.

ubuntu 12.04 kullanıyorum.

+1

'1> & 1' tuhaf, hiçbir fikrim yok; stdout'u stdout'a yönlendirir. Genellikle stderr (2) 'yi stdout (1)' e yönlendiren '2> & 1' formunda görürsünüz. '$?' son çıkış kodudur; 'grep' bir şeyle eşleşirse '0', eşleşmezse (veya olmayan bir dosyaya erişme gibi başka bir hatayla karşılaşırsa) '0 'olmaz. – Amadan

+1

Yani '1> & 1' nin tamamen anlamsız olduğunu tahmin ediyorum ... eğer orada olsaydı ya da olmasaydı bir fark yaratmazdı. – Logan

cevap

11

Daha doğrusu "git: check if pull needed "çözümünü kullanır:

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

Daha önce VonC tarafından fark, bu soru" git: check if pull needed" örtüşmektedir.

There

Ben son kaydedilmeyen sürümünün SHA1 alır ve ben Claudio'nın cevabını düzenlemek zorunda

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

İlginç bir alternatif. +1 – VonC

5

uzak kökenli birine karşılaştırır aşağıdaki tek satırlık komut önerdi

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

Bunun için teşekkürler! Bu basit tek liner'ı alıp küçük bir check_mk izleme senaryosuna attım: https://github.com/MaxWinterstein/check_git_pullstatus – Max

İlgili konular