Есть некоторые сценарии, которые не работают правильно, если они проверяют изменения.
Я попробовал это так:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
Есть ли какая-то логическая проверка, были ли изменения с момента последнего коммита, или как я могу действительно проверить, есть ли новые изменения в моем локальном репозитории?
Я делаю все это для сценария создания версии (который я нашел где-то здесь).
git status
?Ответы:
То, что вы делаете, почти сработает: вы должны цитировать,
$CHANGED
если оно пустое, и-z
проверять на пустое, что означает отсутствие изменений. То, что вы имели в виду, было:Цитата из Git's
GIT-VERSION-GEN
:Похоже, вы копировали это, но вы просто забыли эту деталь цитирования.
Конечно, вы также можете просто сделать это:
Или, если вы заботитесь только о случае «что-то изменилось»:
--quiet
Преимущество использования заключается в том, что Git может прекратить обработку, как только он встретит один diff, поэтому может не потребоваться проверка всего дерева работы.источник
git diff --no-ext-diff --quiet --exit-code
для определения грязного состояния.--no-ext-diff
Вариант хорош для безопасности (в случае , если кто - то настроил внешний драйвер дифф), хотя--exit-code
не должно быть необходимым, так как это подразумевается--quiet
.git diff-index
сообщает об изменениях, даже если изменились только времена изменения файлов (а не их содержимое). Если выtouch
файл, он сообщит о модификации, котораяgit status
будет сброшена. Использованиеgit status
как ниже, лучше.Использование
git status
:источник
git status --porcelain --untracked-files=no
]]; затемif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
увидеть, не является ли вывод не пустым. Если это так, значит, есть изменения.Хотя ответ Джефроми хорош, я выкладываю это только для справки.
Из исходного кода Git есть
sh
скрипт, который включает в себя следующее.источник
$1
это строка с названием задачи, которую вы хотите запустить, и$2
строка, которая может содержать пользовательское сообщение об ошибке при ошибке. Например, назовите это какrequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
У меня была похожая проблема, но я также должен был проверить наличие добавленных файлов. Итак, я сделал следующее:
источник
git status
твой другПерейдите в каталог Git для
git status
работы:Задайте переменную, чтобы задать рабочее дерево, чтобы вы не получили ошибку «Эта операция должна выполняться в рабочем дереве»:
Захватить
git status
вывод в переменную BashИспользование,
--porcelain
которое гарантирует, что будет в стандартном формате и разбор:Если -n (не ноль), у нас есть изменения.
источник
Это тоже работает:
источник
Это хорошо работает. В нем также будут перечислены затронутые файлы:
источник
git diff --no-ext-diff --quiet --exit-code
тоже работает.Вот хороший набор функций скрипта Bash, которые проверяют, есть ли diff, распечатывает его пользователю и предлагает пользователю, если они хотели бы зафиксировать изменения перед развертыванием. Он построен для приложений Heroku и Python, но для любого другого приложения не требует особых изменений.
Вы можете скопировать из Gists на: https://gist.github.com/sshadmand/f33afe7c9071bb725105
источник
Вопросу ОП уже более 9 лет. Я не знаю, что
man git-status
тогда было сказано, но вот что сейчас сказано:Это говорит о том, что этот
--porcelain
аргумент хорошо подходит для проверки статуса репо на предмет изменений.На вопрос ОП: «Есть ли какая-то логическая проверка, были ли изменения с момента последнего коммита, или как я могу действительно проверить, есть ли новые изменения в моем локальном репозитории?»
Я не думаю, что это
bash
имеет логические типы данных как таковые , но это может быть достаточно близко:Это может быть повторно приведено в виде
if-then-else
формы для скрипта или выполнено как есть в CLI, находясь в папке git repo . В противном случае используйте-C
опцию с указанием пути к интересующему репо:Приложение:
-u, --untracked-file
опцию, чтобы избежать сообщения о статусе файлов, которые желательно игнорировать. Обратите внимание, что это приводит к нежелательному побочному эффекту : недавно добавленные файлы также не имеют статуса. Опция полезна в некоторых ситуациях , но внимательно ее изучите перед использованием.источник
Вот как я это делаю ...
источник
вставьте это
бегать
sh checker_git.sh gitpath
источник
Основываясь на комментарии @ storm_m2138 к ответу @ RyanMoon ( ссылка ), я использую следующее в
Powershell
.источник