Что добавить в "git status --porcelain", чтобы заставить его вести себя как "git status"?

Более ранний вопрос привел к некоторым идеям о том, как проверить, содержит ли ваш репозиторий Git грязный индекс или необработанные файлы. Ответ, который я принял из этого обсуждения, был следующим:

#!/bin/sh
exit $(git status --porcelain | wc -l)

Идея этого ответа заключалась в том, чтобы подражать тому, что программист сделал бы: запустите git status, а затем просмотрите вывод.

К сожалению, git status --porcelain и git status не делают то же самое. В частности, git status сообщит о неустановленных изменениях, а git status --porcelain не будет. Вот пример

[[email protected] math-hl]$ git status --porcelain
[[email protected] math-hl]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)
#
nothing to commit, working directory clean

Итак, мой вопрос: что мне нужно добавить к оригиналу script, чтобы также определить, когда репо отменило изменения? В частности, будет ли это правильный подход?

#!/bin/bash
if [ $(git status --porcelain | wc -l) != "0" \
        -o $(git log @{u}.. | wc -l) != "0" ];  then
        echo "local repo is not clean"

Было бы хорошо, в конечном счете, полагаться на git log, или вместо этого использовать команду "сантехника"?

Ответ 1

Идея в сценариях git должна всегда использоваться:

См. "Что означает термин "фарфор" в Git?".
Как я объясню, опция --porcelain, к сожалению (потому что ее именование запутанно), "сантехнический" способ получить статус, то есть "надежный" способ, то есть его формат со временем не изменится, что почему это рекомендуемая команда для сценариев.

Для git log лучше использовать git rev-list:

git rev-list [email protected]{upstream}..HEAD

См. "Как узнать, имеют ли репозитории git изменения, которые не были синхронизированы с сервером (происхождение)?"

Ответ 2

Примечание: git status --porcelain только что было сделано более надежно с совершить 7a76c28, для git 1.9.2 (апрель 2014 г.)), Matthieu Moy moy)

отключить перевод, когда используется --porcelain

"git status --branch --porcelain" отображает статус ветки (впереди, сзади, ушел) и использовал gettext для перевода строки.

Используйте строковые строки, когда используется --porcelain, но сохраняйте gettextперевод для "git status --short", который по сути тот же, но предназначенный для чтения человеком.

Это означает, что git status --porcelain продолжает показывать другой результат, чем git status, на этот раз из-за отсутствия перевода.
Но этот вывод теперь всегда один и тот же (независимо от LOCALE, используемого для перевода, поскольку указанный перевод теперь отключен опцией --porcelain)


И git status --porcelain снова улучшается в git 2.13 (Q2 2017)

"git status --porcelain" должен обеспечивать стабильный вывод, но несколько строк были оставлены как переводимые по ошибке.

См. commit b9e2bc5 (14 марта 2017 г.) Michael J Грубер (mjg).
(слияние Junio ​​C Hamano - gitster - в совершить 58e9773, 17 марта 2017 г.

Убедитесь, что оставшиеся две строки (начальная фиксация, отсоединенная головка) также стабильны.