Цель состоит в том, чтобы получить однозначный статус, который можно оценить с помощью команды оболочки.
Я пытался, git status
но он всегда возвращает 0, даже если есть элементы для фиксации.
git status
echo $? #this is always 0
У меня есть идея, но я думаю, что это довольно плохая идея.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
Любым другим путем?
обновите с последующим решением, см. сообщение Марка Лонгэйра
Я пробовал это, но это вызывает проблему.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Я получаю следующую ошибку [: ??: binary operator expected
сейчас я смотрю на мужчину и пробую git diff.
=================== код для моей надежды, и надеюсь, что лучший ответ ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
источник
источник
$(git status --porcelain)
. Кроме того, если вы хотите поместить восклицательные знаки в свое сообщение, вам нужно использовать одинарные кавычки, а не двойные кавычки - то естьecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
вместо этого$(git status --porcelain)
, как я и говорил!Ответы:
Альтернативой проверке того, является ли вывод
git status --porcelain
пустым, является проверка каждого условия, о котором вы заботитесь отдельно. Например, не всегда важно, есть ли на выходе файлы без отслеживанияgit status
.Например, чтобы увидеть, есть ли какие-либо локальные неустановленные изменения, вы можете посмотреть код возврата:
Чтобы проверить, есть ли какие-либо изменения, которые поставлены, но не зафиксированы, вы можете использовать код возврата:
Наконец, если вы хотите узнать, есть ли в рабочем дереве какие-либо неотслеживаемые файлы, которые не игнорируются, вы можете проверить, является ли вывод следующей команды пустым:
Обновить: ниже вы спрашиваете, можете ли вы изменить эту команду, чтобы исключить каталоги из выходных данных. Вы можете исключить пустые каталоги, добавив
--no-empty-directory
, но чтобы исключить все каталоги в этом выводе, я думаю, что вам придется фильтровать вывод, например, с помощью:Значение
-v
toegrep
означает вывод только тех строк, которые не соответствуют шаблону, а шаблон соответствует любой строке, заканчивающейся символом a/
.источник
--quiet
(что подразумевает--exit-code
) также отключает вывод для тех, кто хочет только код выхода.Возвращаемое значение
git status
просто сообщает вам код выходаgit status
, если нет каких-либо изменений, которые должны быть зафиксированы.Если вам нужна более читаемая версия
git status
вывода, попробуйтеСмотрите описание
git status
для получения дополнительной информации об этом.Пример использования (скрипт просто проверяет,
git status --porcelain
дает ли какой-либо вывод, анализ не требуется):Обратите внимание, что вы должны заключить в кавычки строку для проверки, т.е. вывод
git status --porcelain
. Для получения дополнительных советов о тестовых конструкциях см. Руководство по расширенному написанию сценариев Bash ( Сравнение строк раздела ).источник
|| echo no
к подстановке команд, чтобы рабочая область не была ошибочно сообщена чистой, если произошелgit status
сбой. Кроме того, ваш код (похвально) POSIX-совместимый, но поскольку вы ссылаетесь на руководство по bash, позвольте мне добавить, что если вы используете bash[[ ... ]]
вместо POSIX-совместимого[ ... ]
, вам не нужно заключать в кавычки подстановку команд (хотя это не вредит)[[ -z $(git status --porcelain) ]]
.Если вы похожи на меня, вы хотите знать, если есть:
1) изменения в существующих файлах 2) вновь добавленные файлы 3) удаленные файлы
и конкретно не хочу знать про 4) неотслеживаемые файлы.
Это должно сделать это:
Вот мой bash-код для выхода из скрипта, если репозиторий чист. Используется короткая версия опции неотслеживаемых файлов:
источник
—untracked-files=no
; Я думаю, что ваш тест может быть упрощен до[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
не следует писать в stderr, если что-то фундаментальное не идет не так - и тогда вы действительно хотите увидеть этот вывод. (Если вам нужно более устойчивое поведение в этом событии, добавьте|| echo no
подстановку команд, чтобы проверка на чистоту все еще не прошла). Сравнение строк /-z
оператор может работать с многострочными строками - в этом нет необходимостиtail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Это можно комбинировать
git status --porcelain
с простымgrep
для выполнения теста.Я использую это как простой однострочник иногда:
Добавьте
-qs
к своей команде grep, чтобы она замолчала.источник
git status
фатального сбоя (например, поврежденного репо) ваш тест по ошибке сообщит о чистом рабочем пространстве. Можно использовать один вариантgit status --porcelain 2>&1
, но это «съест» сообщение об ошибке, если вы используете grep с-q
. (Работа с этим потеряет элегантность:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
Из исходного кода git есть скрипт sh, который включает в себя следующее.
Этот фрагмент показывает, как его можно использовать
git diff-files
иgit diff-index
выяснить, есть ли какие-либо изменения в ранее известных файлах. Однако это не позволяет вам узнать, был ли добавлен новый неизвестный файл в рабочее дерево.источник
if [ -n "$(git ls-files --others --exclude-standard)" ]
без каких-либо дополнительных трубопроводов или greping должно быть достаточно для обнаружения неотслеживаемых файлов.я бы сделал тест на это:
или это должно быть явно:
где:
--exit-код
Сделайте выход из программы с кодами, похожими на diff (1). То есть, он завершается с 1, если были различия, а 0 означает, что нет различий.
--тихо
Отключить все выходные данные программы. Подразумевает - Exit-код
источник
Я немного опоздал в обсуждении, но если вам нужен только код выхода 0, если
git status --porcelain
ничего не возвращается и еще! = 0, попробуйте это:Это приведет к тому, что количество строк будет кодом выхода, что может привести к проблемам при наличии более 255 строк. Так
будет учитывать это;)
источник
Я использую это в сценарии, чтобы:
1 когда есть файлы diff или неотслеживаемые
[-z "$ (git status --porcelain)"]
источник
if ! git diff --quiet; then
чище и эффективнее (я думаю). Другими словами, используйте код выхода, а не стандартный вывод.git diff --quiet
ведет себя иначе, чемgit status --porcelain
для кэшированных изменений.Не красиво, но работает:
Не уверен, зависит ли сообщение от локали, поэтому, возможно, поставьте
LANG=C
перед.источник