Проверьте, нужно ли тянуть в Git - PullRequest
578 голосов
/ 15 июля 2010

Как проверить, изменился ли удаленный репозиторий и нужно ли мне тянуть?

Теперь я использую этот простой скрипт:

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

Но это довольно тяжело.

Есть ли лучший способ? Идеальным решением было бы проверить все удаленные ветви и вернуть имена измененных веток и количество новых коммитов в каждой.

Ответы [ 22 ]

6 голосов
/ 23 августа 2017

Сценарий ниже отлично работает.

changed=0
git remote update && git status -uno | grep -q 'Your branch is behind' && changed=1
if [ $changed = 1 ]; then
    git pull
    echo "Updated successfully";
else
    echo "Up-to-date"
fi
5 голосов
/ 07 июня 2018

Я просто хочу опубликовать это как фактическое сообщение, так как это легко пропустить в комментариях.

Правильный и лучший ответ на этот вопрос дал @ Джейк Бергер, Большое спасибо, чувак, это нужно всем, и все упускают это в комментариях. Таким образом, для всех, кто борется с этим, это правильный ответ, просто используйте вывод этой команды, чтобы узнать, нужно ли вам делать git pull. если вывод равен 0, то, очевидно, обновлять нечего.

@ stackoverflow, дай этому парню колокола. Спасибо @ Джейк Бергер

git rev-list HEAD...origin/master --count will give you the total number of "different" commits between the two. – Jake Berger Feb 5 '13 at 19:23
5 голосов
/ 01 сентября 2013

Если вы запустите этот скрипт, он проверит, нужна ли текущей ветке git pull:

#!/bin/bash

git fetch -v --dry-run 2>&1 |
    grep -qE "\[up\s+to\s+date\]\s+$(
        git branch 2>/dev/null |
           sed -n '/^\*/s/^\* //p' |
                sed -r 's:(\+|\*|\$):\\\1:g'
    )\s+" || {
        echo >&2 "Current branch need a 'git pull' before commit"
        exit 1
}

Очень удобно помещать его в качестве предварительной фиксации Git-хука, чтобы избежать

Merge branch 'foobar' of url:/path/to/git/foobar into foobar

когда вы commit до pulling.

Чтобы использовать этот код в качестве хука, просто скопируйте / вставьте скрипт в

.git/hooks/pre-commit

и

chmod +x .git/hooks/pre-commit
4 голосов
/ 19 июля 2010

Запустите git fetch (remote), чтобы обновить удаленные ссылки, он покажет вам, что нового.Затем, когда вы проверяете свое местное отделение, оно покажет вам, находится ли оно за апстримом.

2 голосов
/ 02 июля 2013

Вот моя версия скрипта Bash, который проверяет все репозитории в предопределенной папке:

https://gist.github.com/henryiii/5841984

Он может различать обычные ситуации, такие как «тянуть» и «толкать», и он многопоточный, поэтому выборка происходит одновременно. У него есть несколько команд, таких как pull и status.

Поместите символическую ссылку (или скрипт) в папку на вашем пути, тогда она будет работать как git all status (и т. Д.). Он поддерживает только origin / master, но его можно редактировать или комбинировать с другим методом.

1 голос
/ 07 марта 2018

Используя простое регулярное выражение:

str=$(git status) 
if [[ $str =~ .*Your\ branch\ is\ behind.*by.*commits,\ and\ can\ be\ fast-forwarded ]]; then
    echo `date "+%Y-%m-%d %H:%M:%S"` "Needs pull"
else
    echo "Code is up to date"
fi
1 голос
/ 11 марта 2013
git ls-remote | cut -f1 | git cat-file --batch-check >&-

перечислит все ссылки на любой пульт, который отсутствует в вашем репо. Чтобы поймать удаленные изменения ссылок на вещи, которые у вас уже были (например, сброс к предыдущим коммитам), требуется немного больше:

git pack-refs --all
mine=`mktemp`
sed '/^#/d;/^^/{G;s/.\(.*\)\n.* \(.*\)/\1 \2^{}/;};h' .git/packed-refs | sort -k2 >$mine
for r in `git remote`; do 
    echo Checking $r ...
    git ls-remote $r | sort -k2 | diff -b - $mine | grep ^\<
done
0 голосов
/ 24 марта 2018

Для пользователей Windows, которые в конечном итоге задают этот вопрос, я изменил некоторые из ответов в сценарий powershell.Настройте при необходимости, сохраните в файл .ps1 и запустите по требованию или по расписанию, если хотите.

cd C:\<path to repo>
git remote update                           #update remote
$msg = git remote show origin               #capture status
$update = $msg -like '*local out of date*'
if($update.length -gt 0){                   #if local needs update
    Write-Host ('needs update')
    git pull
    git reset --hard origin/master
    Write-Host ('local updated')
} else {
    Write-Host ('no update needed')
}
0 голосов
/ 22 июня 2016

Может быть, если вы хотите добавить задачу в виде crontab:

#!/bin/bash
dir="/path/to/root"
lock=/tmp/update.lock
msglog="/var/log/update.log"

log()
{
        echo "$(date) ${1:-missing}" >> $msglog
}

if [ -f $lock ]; then
        log "Already run, exiting..."
else
        > $lock
        git -C ~/$dir remote update &> /dev/null
        checkgit=`git -C ~/$dir status`
        if [[ ! "$checkgit" =~ "Your branch is up-to-date" ]]; then
                log "-------------- Update ---------------"
                git -C ~/$dir pull &>> $msglog
                log "-------------------------------------"
        fi
        rm $lock

fi
exit 0
0 голосов
/ 24 мая 2016

Вы также можете найти скрипт Phing , который делает это сейчас.

Мне нужно было решение для автоматического обновления моих производственных сред, и мы очень рады благодаря этому сценарию, которым я делюсь.

Сценарий написан на XML и нуждается в Phing .

...