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

上述代碼是我從腳本中編輯過的東西,我在stackoverflow上找到了從git存儲庫安裝Emacs的腳本。我想要這個腳本要做的是從git repos安裝任何程序,並在需要更新時更新它們。當然,我將不得不提供安裝它的步驟。在這個腳本的情況下,它只需要將clientside目錄複製到/usr/share/gedit/plugins/目錄。如何編寫一個shell腳本來檢查git倉庫是否是最新的?

我不需要任何幫助,如何安裝任何腳本,但我需要的是如何檢查存儲庫是否是最新的,並從那裏去。

現在我不明白的是這部分:

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。所以我明白這是檢查更新的部分,但下一部分不執行(if語句) - 這是將目錄複製到gedit插件目錄的部分。我不明白什麼1>$1的意思或什麼$?的含義。因此我無法解決問題...而我不明白的是爲什麼它認爲Branch is moved不是最新的(我只是假設它說git pull在if語句中不返回0 )。

我敢肯定,它有一個簡單的解決方案,答案將是教育bash和git。我感謝所有的幫助。

我使用的是Ubuntu 12.04。

+1

'1&1'很奇怪,我不知道。它將stdout重定向到stdout。你通常以'2>&1'的形式看到它,它將stderr(2)重定向到stdout(1)。 '$?'是最後的退出代碼;如果'grep'匹配,它將爲'0';如果匹配失敗,則爲'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,這個問題重疊「 git: check if pull needed」。

There我建議以下單行腳本,需要你的最後COMMITED版本的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

非常感謝!我把這個簡單的一行內容放入一個小的check_mk監控腳本中:https://github.com/MaxWinterstein/check_git_pullstatus – Max

相關問題