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

SVN: и bash: как определить, есть ли незафиксированные изменения

Я пытаюсь обернуть стандартную последовательность шагов в оболочке script (linux/bash) и, похоже, не может понять, как сказать, что выполнение svn status вернуло что-либо. Например

~/sandbox/$svn status
?       pat/foo
~/sandbox/$echo $?
0

Если я удалю файл foo, то

svn status

ничего не возвращает, но echo $? по-прежнему 0

Я хочу не делать некоторые шаги, если есть незафиксированные изменения.

Указатели получили высокую оценку.

4b9b3361

Ответ 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, если изменений нет - ведь этот код возврата просто означает, что ошибок не было.

Ответ 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 '[^ ]' - первое непространство подразумевает модификацию.