У меня есть скрипт, который работает rsync
с рабочим каталогом Git в качестве места назначения. Я хочу, чтобы скрипт работал по-разному в зависимости от того, чистый ли рабочий каталог (без изменений для фиксации) или нет. Например, если вывод git status
такой, как показано ниже, я хочу, чтобы скрипт завершился:
git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date
Если каталог не чистый, я бы хотел, чтобы он выполнял еще несколько команд.
Как я могу проверить вывод, как указано выше в сценарии оболочки?
shell-script
git
brentwpeterson
источник
источник
git reset --hard origin/branch
если это то, к чему выОтветы:
Разбор вывода
git status
- плохая идея, потому что вывод предназначен для чтения человеком, а не для чтения машиной. Нет гарантии, что выходные данные останутся прежними в будущих версиях Git или в средах с другой конфигурацией.Комментарий UVVs находится на правильном пути, но, к сожалению, код возврата
git status
не изменяется при наличии незафиксированных изменений. Тем не менее, он предоставляет--porcelain
опцию, которая приводит к тому, что выводgit status --porcelain
скриптов форматируется в простом для анализа формате и остается стабильным во всех версиях Git и независимо от конфигурации пользователя.Мы можем использовать пустой вывод
git status --porcelain
как индикатор того, что нет изменений, которые нужно зафиксировать:Если мы не заботимся о неотслеживаемых файлах в рабочем каталоге, мы можем использовать
--untracked-files=no
опцию, чтобы игнорировать их:Чтобы сделать это более устойчивым к условиям, которые фактически вызывают
git status
сбой без вывода наstdout
, мы можем уточнить проверку:Стоит также отметить, что, хотя
git status
он и не дает значимого кода выхода, когда рабочий каталог нечист, ноgit diff
предоставляет--exit-code
опцию, которая делает его похожим на утилиту diff , то есть завершает работу со статусом,1
когда были различия, и0
ни один не был найден.Используя это, мы можем проверить наличие изменений без изменений с помощью:
и поставил, но не совершил изменения с:
Хотя он
git diff
может сообщать о неотслеживаемых файлах в подмодулях с помощью соответствующих аргументов, к--ignore-submodules
сожалению, кажется, что нет способа сделать так, чтобы он сообщал о неотслеживаемых файлах в реальном рабочем каталоге. Если неотслеживаемые файлы в рабочем каталоге актуальны,git status --porcelain
возможно, это лучший выбор.источник
git status --porcelain
завершит работу с кодом 0, даже если есть изменения, не подготовленные для коммитов и неотслеживаемых файлов.git stash
будет ли что-либо предприниматься (он не выдает полезного кода возврата). Я должен был добавить,--ignore-submodules
как иначеgit status
будет означать изменения субмодуля, которыйgit stash
игнорирует.if [ -z
делал. В-z
означает , что если следующая строка пуста, если имеет значениеtrue
. Другими словами, если этоgit status --porcelain
приводит к отсутствию строки, репо чистое. Если нет, то он перечисляет измененные / добавленные / удаленные файлы и больше не является пустой строкой.if
Затем вычисляетfalse
.Использование:
Код возврата отражает состояние рабочего каталога (0 = чистый, 1 = грязный). Не отслеживаемые файлы игнорируются.
источник
git update-index --refresh
раньшеgit diff-index HEAD
. Более подробная информация: stackoverflow.com/q/34807971/1407170git add .
перед его выдачей. Обычно это способ использовать его в сценарииset +e
перед вызовомgit
и добавив ещеset -e
раз после оценки$?
.Незначительное продолжение превосходного ответа Андре .
Это один из способов оценить результаты, а также избежать ловушки, если вы находитесь в сценарии, который ранее выполнял set -e .
Не отслеживаемые файлы игнорируются.
источник