Разбор вывода git status
- плохая идея, потому что вывод предназначен для чтения человеком, а не для чтения машиной. Нет гарантии, что выходные данные останутся прежними в будущих версиях Git или в средах с другой конфигурацией.
Комментарий UVVs находится на правильном пути, но, к сожалению, код возврата git status
не изменяется при наличии незафиксированных изменений. Тем не менее, он предоставляет --porcelain
опцию, которая приводит к тому, что вывод git status --porcelain
скриптов форматируется в простом для анализа формате и остается стабильным во всех версиях Git и независимо от конфигурации пользователя.
Мы можем использовать пустой вывод git status --porcelain
как индикатор того, что нет изменений, которые нужно зафиксировать:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Если мы не заботимся о неотслеживаемых файлах в рабочем каталоге, мы можем использовать --untracked-files=no
опцию, чтобы игнорировать их:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Чтобы сделать это более устойчивым к условиям, которые фактически вызывают git status
сбой без вывода на stdout
, мы можем уточнить проверку:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Стоит также отметить, что, хотя git status
он и не дает значимого кода выхода, когда рабочий каталог нечист, но git diff
предоставляет --exit-code
опцию, которая делает его похожим на утилиту diff , то есть завершает работу со статусом, 1
когда были различия, и 0
ни один не был найден.
Используя это, мы можем проверить наличие изменений без изменений с помощью:
git diff --exit-code
и поставил, но не совершил изменения с:
git diff --cached --exit-code
Хотя он git diff
может сообщать о неотслеживаемых файлах в подмодулях с помощью соответствующих аргументов, к --ignore-submodules
сожалению, кажется, что нет способа сделать так, чтобы он сообщал о неотслеживаемых файлах в реальном рабочем каталоге. Если неотслеживаемые файлы в рабочем каталоге актуальны, git status --porcelain
возможно, это лучший выбор.