Я использую git diff --exit-code чтобы раскрасить подсказку оболочки, чтобы увидеть, есть ли различия в рабочей копии. В очень больших репозиториях это занимает очень много времени, пока git diff без дополнительного аргумента.

Я надеялся, что --exit-code заставит git завершиться, как только он обнаружит первое различие, но на самом деле он действительно печатает diff. При запуске с параметром --quiet он, конечно, не печатает diff, но все равно занимает столько же времени, что предполагает, что он все еще вычисляет все изменения, даже если не показывает их.

Так что мой вопрос: есть ли способ , с git diff (или любая другая команда мерзавца) , чтобы просто проверить , есть ли дифференциалы и установить код выхода соответственно, но не заботясь , чтобы найти и форматировать все фактические изменения?

Изменить: Для контекста о размере репо, это составляет около 7,5 ГБ (из которых 4,1 ГБ. GIT .git/ DIR), и ~ 160 К отслеживаемых файлов.

2 ответа2

0

Насколько я знаю, нет никакого способа сделать это напрямую с помощью git.

Тем не менее, вы можете использовать следующий фрагмент сценария оболочки для более быстрой проверки:

#!/bin/sh
[ `git status --porcelain=1 | wc -l` -ne 0 ] && exit 1

Это позволяет получить машинно-разборный вывод из команды git status (которая выполняется быстрее, чем git diff в больших репозиториях, потому что она проверяет только наличие изменений, а не то, что они есть), считая количество строк (--porcelain=1 Формат = 1 вернет ровно одну строку для каждого измененного файла, и не будет строк, если они не были изменены), а затем завершит работу с ненулевым состоянием выхода, если число ненулевое.

Вы также можете просто встроить это непосредственно в любой скрипт, который генерирует вашу подсказку, извлекая условное выражение (бит в []) и используя его в любом операторе if, который проверяет код выхода для git diff --quiet настоящее время.

0

Я не могу сразу найти простую команду, но я проверил, что делает модуль git prompt в oh-my-zsh, и это достаточно быстро:

Проверьте вывод состояния git status --porcelain --untracked-files=no . Когда файл модифицируется, он будет иметь M во втором столбце, а когда присутствует конфликт файлов, он будет иметь U в первом столбце.

Вы можете сделать что-то вроде этого:

prompt() {
    git status --porcelain --untracked-files=no | grep '^.M' > /dev/null
    CHANGED=$?
    # $CHANGED -eq 0 when there are uncommitted changes

    git status --porcelain --untracked-files=no | grep '^U.' > /dev/null
    CONFLICTS=$?
    # $CONFLICTS -eq 0 when there are merge or rebase conflicts

    git status --porcelain --untracked-files=no | grep '^' > /dev/null
    CLEAN=$((1 - $?))
    # $CLEAN -eq 0 when there are *no* changes, conflicts, or uncommitted staged files
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .