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

उपर्युक्त कोड कुछ ऐसा है जो मैंने स्क्रिप्ट से संपादित किया है जिसे मैंने स्टैक ओवरफ्लो पर पाया है ताकि गिट रिपॉजिटरी से Emacs इंस्टॉल किया जा सके। मैं यह स्क्रिप्ट करना चाहता हूं कि गिट रिपोज़ से किसी भी प्रोग्राम को इंस्टॉल करना है, और यदि अपडेट आवश्यक है तो उन्हें अपडेट करें। बेशक मुझे इसे स्थापित करने के लिए कदम प्रदान करना होगा। इस स्क्रिप्ट के मामले में इसे clientside निर्देशिका को /usr/share/gedit/plugins/ निर्देशिका में कॉपी करने की आवश्यकता है।एक शेल स्क्रिप्ट कैसे लिखें जो जांचता है कि गिट रिपॉजिटरी अद्यतित है या नहीं?

मुझे किसी भी स्क्रिप्ट को स्थापित करने के तरीके की कोई ज़रूरत नहीं है, लेकिन मुझे क्या चाहिए यह जांचना है कि क्या भंडार अद्यतित है या वहां से जाना है।

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

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

जब मैं टर्मिनल में git pull 1>&1 | grep "Already up-to-date." && $? चलाने उत्पादन Already up-to-date. 0 है:

अभी मैं क्या समझ में नहीं आता इस हिस्सा है। तो मैं समझता हूं कि यह वह हिस्सा है जो अद्यतनों की जांच करता है हालांकि अगला भाग निष्पादित नहीं करता है (अगर कथन) - जो वह हिस्सा है जो निर्देशिका को जीएडिट प्लगइन निर्देशिका में कॉपी करता है। मुझे समझ में नहीं आता कि 1>$1 का अर्थ है या $? का अर्थ क्या है। इसलिए मैं समस्या को हल नहीं कर सका ... और जो मुझे समझ में नहीं आता है, वह यह सोचता है कि Branch is moved जब यह अद्यतित नहीं है (मुझे लगता है कि यह कहता है कि git pull0 वापस कथन में वापस नहीं आता है)।

मुझे यकीन है कि इसका एक आसान समाधान है और उत्तर दोनों बाश और गिट के लिए शिक्षित होगा। हम आपकी मदद की सराहना करते हैं।

मैं उबंटू 12.04 का उपयोग कर रहा हूं।

+1

'1> और 1' अजीब है, मेरे पास कोई सुराग नहीं है; यह stdout stdout को रीडायरेक्ट करता है। आप आमतौर पर इसे '2> और 1' रूप में देखते हैं, जो stderr (2) से stdout (1) को रीडायरेक्ट करता है। '$?' अंतिम निकास कोड है; यदि 'grep' कुछ मेल खाता है, तो यह' 0' होगा, अगर यह मिलान करने में विफल रहा है (या किसी अन्य त्रुटि का अनुभव किया है, जैसे गैर-मौजूद फ़ाइल तक पहुंचने में)। – Amadan

+1

तो मुझे लगता है कि '1> और 1' पूरी तरह से व्यर्थ है ... यदि वहां था या नहीं तो इससे कोई फर्क नहीं पड़ता। – Logan

उत्तर

11

मैं नहीं बल्कि "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

जैसा कि पहले ही Vonc द्वारा देखा, इस सवाल का overlaps "git: check if pull needed"।

There मैं निम्नलिखित एक-पंक्ति स्क्रिप्ट है कि अपने पिछले प्रतिबद्ध संस्करण की SHA1 लेता है और दूरदराज के मूल के एक

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

दिलचस्प विकल्प। +1 – VonC

5

मैं क्लाउडियो के जवाब संपादित करने के लिए किया था यह तुलना सुझाव

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

इसके लिए धन्यवाद! मैंने यह सरल एक-लाइनर लिया और इसे कुछ छोटी चेक_एमके निगरानी स्क्रिप्ट में फेंक दिया: https://github.com/MaxWinterstein/check_git_pullstatus – Max