Как я могу проверить 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 (которую я нашел где-то здесь)
Ответы
Ответ 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;