7

Проверьте, нужно ли выполнять pull в Git

5

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

Я использую следующий простой скрипт:

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

Однако этот способ довольно тяжелый и неэффективный.

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

5 ответ(ов)

1

Если у вас есть исходная ветка

git fetch <remote>
git status

Если у вас нет исходной ветки

Сравните две ветки:

git fetch <remote>
git log <local_branch_name>..<remote_branch_name> --oneline

Например:

git fetch origin

# Посмотрите, есть ли Incoming изменения
git log HEAD..origin/master --oneline

(Я предполагаю, что origin/master — это ваша ветка отслеживания на удалённом сервере)

Если в выводе будут перечислены коммиты, значит, у вас есть изменения, которые нужно интегрировать — необходимо выполнить слияние. Если git log не показывает никаких коммитов, значит, сливать нечего.

Обратите внимание, что этот способ будет работать даже если вы находитесь в функциональной ветке, которая не имеет отслеживаемого удалённого адреса, так как вы явно указываете origin/master, вместо того чтобы использовать запомненную Git вышестоящую ветку.

1

Если это для скрипта, вы можете использовать:

git fetch
$(git rev-parse HEAD) == $(git rev-parse @{u})

Обратите внимание: преимущество этого метода по сравнению с предыдущими ответами заключается в том, что вам не нужно использовать отдельную команду для получения имени текущей ветки. "HEAD" и "@" (восходящая ветка текущей ветки) обрабатывают это сами. Для получения дополнительных сведений смотрите "git rev-parse --help".

0

Команда

git ls-remote origin -h refs/heads/master

отображает текущий хед на удаленном репозитории. Вы можете сравнить его с предыдущим значением или проверить, есть ли данный SHA в вашем локальном репозитории.

0

Скрипт, приведённый ниже, работает отлично.

changed=0
git remote update && git status -uno | grep -q 'Ваша ветка отстает' && changed=1
if [ $changed = 1 ]; then
    git pull
    echo "Успешно обновлено";
else
    echo "Все актуально"
fi

Этот скрипт проверяет, отстаёт ли ваша ветка от удалённой версии. Если да, то выполняется git pull для обновления локальной ветки, и выводится сообщение о успешном обновлении. Если ветка актуальна, выводится сообщение об этом.

0

Я хотел бы сделать отдельный пост, чтобы этот ответ не затерялся в комментариях.

Правильный и лучший ответ на этот вопрос был дан @Jake Berger. Большое спасибо тебе, дружище, это действительно нужно многим, и большинство упускает это из комментариев.

Итак, для всех, кто с этим борется, вот правильный ответ: используйте вывод этой команды, чтобы определить, нужно ли вам делать git pull. Если вывод равен 0, значит, обновлений нет.

@stackoverflow, дайте этому парню признание. Спасибо, @Jake Berger!

# покажет вам общее количество "различных" коммитов между двумя
# Jake Berger 5 фев '13 в 19:23
git rev-list HEAD...origin/master --count
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь