Проверьте, нужно ли выполнять pull в Git
Заголовок: Как проверить, изменился ли удаленный репозиторий, и нужно ли выполнять pull?
Я использую следующий простой скрипт:
git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1
Однако этот способ довольно тяжелый и неэффективный.
Есть ли более оптимальное решение? Идеальным вариантом было бы проверить все удаленные ветки и вернуть имена измененных веток, а также количество новых коммитов в каждой из них.
5 ответ(ов)
Если у вас есть исходная ветка
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 вышестоящую ветку.
Если это для скрипта, вы можете использовать:
git fetch
$(git rev-parse HEAD) == $(git rev-parse @{u})
Обратите внимание: преимущество этого метода по сравнению с предыдущими ответами заключается в том, что вам не нужно использовать отдельную команду для получения имени текущей ветки. "HEAD" и "@" (восходящая ветка текущей ветки) обрабатывают это сами. Для получения дополнительных сведений смотрите "git rev-parse --help".
Команда
git ls-remote origin -h refs/heads/master
отображает текущий хед на удаленном репозитории. Вы можете сравнить его с предыдущим значением или проверить, есть ли данный SHA в вашем локальном репозитории.
Скрипт, приведённый ниже, работает отлично.
changed=0
git remote update && git status -uno | grep -q 'Ваша ветка отстает' && changed=1
if [ $changed = 1 ]; then
git pull
echo "Успешно обновлено";
else
echo "Все актуально"
fi
Этот скрипт проверяет, отстаёт ли ваша ветка от удалённой версии. Если да, то выполняется git pull
для обновления локальной ветки, и выводится сообщение о успешном обновлении. Если ветка актуальна, выводится сообщение об этом.
Я хотел бы сделать отдельный пост, чтобы этот ответ не затерялся в комментариях.
Правильный и лучший ответ на этот вопрос был дан @Jake Berger. Большое спасибо тебе, дружище, это действительно нужно многим, и большинство упускает это из комментариев.
Итак, для всех, кто с этим борется, вот правильный ответ: используйте вывод этой команды, чтобы определить, нужно ли вам делать git pull. Если вывод равен 0, значит, обновлений нет.
@stackoverflow, дайте этому парню признание. Спасибо, @Jake Berger!
# покажет вам общее количество "различных" коммитов между двумя
# Jake Berger 5 фев '13 в 19:23
git rev-list HEAD...origin/master --count
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Посчитать количество строк в репозитории Git
Как добавить перенос строки в 'git commit -m' из командной строки?
Как выводить команды оболочки по мере их выполнения
Как получить пароль из оболочки без вывода в терминал?