Программно печатающий пересмотр мерзавца и проверяющий на незафиксированные изменения

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

Например, если там незафиксированы изменения, это должно произвести

Warning: uncommitted changes made. This output may not be reproducible.

Еще, произвести

Current commit: d27ec73cf2f1df89cbccd41494f579e066bad6fe

Идеально, это должно использовать "инфраструктуру", не "фарфор".

7
задан Andrew Grimm 29 April 2010 в 01:57
поделиться

2 ответа

Здесь используется фарфор, но git diff --exit-code завершается с 1, если есть отличия от существующих файлов, и 0, если нет отличий от существующих файлов. К сожалению, он не проверяет наличие неотслеживаемых файлов.

Этот ответ на вопрос Как получить хэш для текущего коммита в Git? рекомендует git rev-parse --verify HEAD распечатать текущую фиксацию.

1
ответ дан 7 December 2019 в 03:13
поделиться

Вам нужны компоненты Git-сантехники: diff-index , вер. -parse --verify и, возможно, rev-parse --show-cdup с ls-files --others .

Следующая программа оболочки использует эти соединительные команды Git, имеет настраиваемую обработку без отслеживания / игнорирования и довольно осторожна во всех возможных случаях ошибок.

#!/bin/sh

# warn-unclean: print a warning if the working tree and index are not clean

#  For utmost strictness, set check_untracked=yes and check_ignored=yes.
#  When both are 'yes', verify that working tree and index are identical to HEAD.
#  When only check_untracked is yes, extra ignored files are allowed.
#  When neither is yes, extra untracked files and ignored files are allowed.

check_untracked=yes
check_ignored=yes

warn() {
    echo 'Warning: '"$*" \
        'This output may not be reproducible.'
}

# Compare HEAD to index and/or working tree versions of tracked files
git diff-index --quiet HEAD
case $? in
    0)
        if test "$check_untracked" != yes; then
            clean=yes
        else
            # Still need to check for untracked files

            or_ignored=''
            exclude=--exclude-standard
            if test "$check_ignored" = yes; then
                or_ignored=' or ignored'
                exclude=''
            fi

            (
                # Move to top level of working tree
                if up="$(git rev-parse --show-cdup)"; then
                    test -n "$up" && cd "$up"
                else
                    echo 'error running "git rev-parse --show-cdup"'
                    exit 129
                fi

                # Check for untracked files
                git ls-files --others $exclude --error-unmatch . >/dev/null 2>&1
                case $? in
                    0)  # some untracked/ignored file is present
                        warn 'some untracked'"$or_ignored"' file is present.'
                        exit 1
                    ;;
                    1)  # no untracked files
                        exit 0
                    ;;
                    *)
                        echo 'error running "git diff-index"!'
                        exit 129
                    ;;
                esac

            )
            case $? in
                0) clean=yes ;;
                1) clean=no ;;
                *) exit $? ;;
            esac
        fi

        test "$clean" = yes &&
        if c="$(git rev-parse --verify HEAD)"; then
            echo 'Current commit: '"$c"
        else
            echo 'error running "git rev-parse --verify"!'
        fi
    ;;
    1)
        warn 'some tracked file has an uncommitted change.'
    ;;
    *)
        echo 'error running "git diff-index"!'
        exit 129
    ;;
esac

Вы можете добавить еще несколько exit , если хотите, чтобы его код выхода был значимым во всех случаях.

Если вас не заботит вся обработка ошибок или неотслеживаемая / игнорируемая обработка, тогда может быть достаточно чего-нибудь короткого:

if git diff-index --quiet; then
    printf 'Current commit: %s\n' "$(git rev-parse --verify HEAD)
else
    echo 'Warning: …'
fi

Вы также можете проверить наличие неотслеживаемых файлов (которые можно настроить для игнорирования и т. Д.) В сжатой форме, без обработки ошибок:

git ls-files --others --exclude-standard --error-unmatch \
    "./$(git rev-parse --show-cdup)" >/dev/null 2>&1
8
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: