SVN: и bash: как определить, есть ли незафиксированные изменения
Я пытаюсь обернуть стандартную последовательность шагов в оболочке script (linux/bash) и, похоже, не может понять, как сказать, что выполнение svn status
вернуло что-либо. Например
~/sandbox/$svn status
? pat/foo
~/sandbox/$echo $?
0
Если я удалю файл foo, то
svn status
ничего не возвращает, но echo $?
по-прежнему 0
Я хочу не делать некоторые шаги, если есть незафиксированные изменения.
Указатели получили высокую оценку.
Ответы
Ответ 1
Почему бы не проверить результат с svn status -q
? Что-то вроде:
result=`svn status -q`
[ -z "$result" ] && echo "No changes" && exit 1
echo "Changes found"
exit 0
Если вы используете svn:externals
в своем репо, см. комментарии и ответы ниже для дополнительных методов.
Ответ 2
Или вы можете попробовать
svn status | grep [AMCDG]
echo $?
должен возвращать 0, если есть изменения, и 1, если их нет
Ответ 3
Принятый ответ не будет работать, если ваш проект содержит ссылки svn:externals
. В этом случае svn status -q
будет выдавать результат, даже если рабочая копия не имеет локальных изменений. Например, мой проект зависит от нескольких библиотек, которые хранятся в отдельной части репозитория:
$ svn status -q
X Externals/ETCKit
X Externals/RulesParser
X Externals/XMLRPC
Performing status on external item at 'Externals/ETCKit':
Performing status on external item at 'Externals/XMLRPC':
Performing status on external item at 'Externals/RulesParser':
Чтобы учесть этот дополнительный вывод, я закончил использование awk
:
if [[ -n $(svn status -q . | awk '$1 ~ /[!?ABCDGKLMORST]/') ]]; then
echo "The working copy at $(pwd) appears to have local modifications"
fi
Этот script выводит результат svn status -q
и отфильтровывает любые строки, которые не начинаются со кода состояния, указывающего локальное изменение. Если конечным результатом является пустая строка, то рабочая копия будет чистой.
Ответ 4
Я реализовал нечто подобное некоторое время назад. Вы не должны полагаться на возвращаемое значение svn status
, но вместо этого проанализируйте его вывод. Например, вы должны искать строки, начинающиеся с "M", "A", "D" и т.д. Вы можете использовать perl, чтобы помочь вам в этом. Основываясь на результатах этого разбора, вы обязательно узнаете, есть ли изменения или нет.
Btw не нормально для svn status
возвращать 0, если изменений нет - ведь этот код возврата просто означает, что ошибок не было.
Ответ 5
Вы можете проверить номер версии с помощью svnversions от kde.org
http://websvn.kde.org/trunk/KDE/kdesdk/scripts/svnversions?view=log
Ответ 6
Вот решение, которое я использовал. Работает с svn externals и избегает явно перечислять статусы svn в ваших сценариях (что может или не может быть хорошей вещью в зависимости от вашей точки зрения).
# tested with svn 1.6.11/bash 4.1.2
if [ "$(svn st -q | cut -c -8 | sed '/^[^ ]*$/d' | grep -m 1 '[^ ]')" ]; then
echo "changes detected"
fi
svn st -q
- перечисляет статусы без X для внешних каталогов.
cut -c -8
- падает все, кроме первых 8 столбцов.
sed '/^[^ ]*$/d'
- отбрасывает строки "Выполнение...", которые видны при работе с внешними.
grep -m 1 '[^ ]'
- первое непространство подразумевает модификацию.