Подтвердить что ты не робот

Как я могу проверить bash script, если у моего локального репозитория git есть изменения

Есть несколько сценариев, которые не работают корректно, если они проверяют изменения.

Я пробовал вот так:

VN=$(git describe --abbrev=7 HEAD 2>/dev/null)  

git update-index -q --refresh  
CHANGED=$(git diff-index --name-only HEAD --)  
if [ ! -z $CHANGED ];  
    then VN="$VN-mod"   
fi

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

Я делаю все это для создания версии script (которую я нашел где-то здесь)

4b9b3361

Ответ 1

То, что вы делаете, почти сработает: вы должны процитировать $CHANGED, если он пуст, а -z - для пустого, что означает отсутствие изменений. Что вы имели в виду:

if [ -n "$CHANGED" ]; then
    VN="$VN-mod"
fi

Цитата из git GIT-VERSION-GEN:

git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-dirty"

Похоже, вы копировали это, но вы просто забыли эту деталь цитаты.

Конечно, вы могли бы просто сделать это:

if git diff-index --quiet HEAD --; then
    # no changes
else
    # changes
fi

или если вы только заботитесь о случае "что-то изменилось":

if ! git diff-index --quiet HEAD --; then
    VN="$VN-mod"
fi

Использование --quiet имеет то преимущество, что git может прекратить обработку, как только он встретит один diff, поэтому может не потребоваться проверить все дерево работы.

Ответ 2

Использование git статуса

cd /git/directory
if [[ `git status --porcelain` ]]; then
  # changes
else
  # no changes
fi

Ответ 3

Хотя ответ Jefromi хорош, я публикую это только для справки.

Из исходного кода git находится sh script, который включает следующее.

require_clean_work_tree () {
    git rev-parse --verify HEAD >/dev/null || exit 1
    git update-index -q --ignore-submodules --refresh
    err=0

    if ! git diff-files --quiet --ignore-submodules
    then
        echo >&2 "Cannot $1: You have unstaged changes."
        err=1
    fi

    if ! git diff-index --cached --quiet --ignore-submodules HEAD --
    then
        if [ $err = 0 ]
        then
            echo >&2 "Cannot $1: Your index contains uncommitted changes."
        else
            echo >&2 "Additionally, your index contains uncommitted changes."
        fi
        err=1
    fi

    if [ $err = 1 ]
    then
        test -n "$2" && echo >&2 "$2"
        exit 1
    fi
}

Ответ 4

Имел подобную проблему, но мне также пришлось проверять наличие добавленных файлов. Поэтому я сделал следующее:

cd /local/repo
RUN=0
git diff --no-ext-diff --quiet --exit-code || RUN=1
if [ $RUN = 0 ]; then
    RUN=`git ls-files --exclude-standard --others| wc -l`
fi

if [ $RUN = 0 ]; then
    exit 0
fi

Ответ 5

Вот хороший набор функций bash script, которые проверяют, есть ли diff, распечатывают его пользователю и запрашивают у пользователя, хотят ли они зафиксировать изменения перед развертыванием. Построен для приложений Heroku и Python, но для любых других приложений мало изменений.

commit(){
    echo "Please enter a commit message..."
    read msg
    git add . --all
    git commit -am $msg
}

check_commit(){
    echo ========== CHECKING FOR CHANGES ========
    changes=$(git diff)
    if [ -n "$changes" ]; then
        echo ""
        echo "*** CHANGES FOUND ***"
        echo "$changes"
        echo ""
        echo "You have uncomitted changes."
        echo "Would you like to commit them (y/n)?"
        read n
        case $n in
            "y") commit;;
            "n") echo "Changes will not be included...";;
            *) echo "invalid option";;
        esac
    else
        echo "... No changes found"
    fi
}
deploy(){
    check_commit
    echo ========== DEPLOYING TO HEROKU ========
    git push heroku master
    heroku run python manage.py syncdb
}

Вы можете скопировать из Gists: https://gist.github.com/sshadmand/f33afe7c9071bb725105

Ответ 6

git статус - ваш друг

перейти в каталог git для статуса git для работы

cd c:/path/to/.git

установить переменную для установки рабочего дерева, чтобы вы не получили ошибку "Эта операция должна выполняться в дереве работы"

WORKTREE=c:/path/to/worktree

захватить вывод состояния git в переменной bash

использовать --porcelain, который гарантирует, что он будет в стандартном формате и анализируется

CHANGED=$(git --work-tree=${WORKTREE} status --porcelain)

если -n (не null), мы имеем изменения.

if [ -n "${CHANGED}" ]; then
  echo 'changed';

else
 echo 'not changed';
fi

Ответ 7

Вот как я это делаю...

CHANGES=`git status | grep "working directory clean"`
if [ ! CHANGES -eq "" ] then
    # do stuff here
else
    echo "You have uncommitted changes..."
fi

Ответ 8

Это хорошо работает. Он также перечислит затронутые файлы:

if git diff-index --name-status --exit-code HEAD;
then
    echo Git working copy is clean...;
else
    echo ;
    echo ERROR: Git working copy is dirty!;
    echo Commit your changes and try again.;
fi;