SVN: и bash: как узнать, есть ли незафиксированные изменения - PullRequest
12 голосов
/ 22 апреля 2010

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

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

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

svn status

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

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

Указатели очень ценятся.

Ответы [ 6 ]

6 голосов
/ 22 апреля 2010

Почему бы не проверить результат из svn status -q? Что-то вроде:

result=`svn status -q`
[ -z "$result" ] && echo "No changes" && exit 1

echo "Changes found"
exit 0

Если вы используете svn:externals в своем репо, см. Комментарии и ответы ниже для дополнительных методов.

4 голосов
/ 05 декабря 2013

Принятый ответ не будет работать, если ваш проект содержит 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

Этот скрипт принимает вывод svn status -q и отфильтровывает все строки, которые не начинаются с кода состояния, указывающего локальное изменение.Если конечным результатом является пустая строка, то рабочая копия чистая.

3 голосов
/ 22 апреля 2010

Или вы можете попробовать

svn status | grep [AMCDG]
echo $?

должен вернуть 0, если есть изменения, и 1, если их нет

2 голосов
/ 22 апреля 2010

Я реализовал нечто подобное некоторое время назад. Вы не должны полагаться на возвращаемое значение svn status, а вместо этого анализировать его вывод. Например, вы должны искать строки, начинающиеся с «M», «A», «D» и т. Д. Вы можете использовать perl , чтобы помочь вам в этом. По результатам этого анализа вы наверняка узнаете, есть изменения или нет.

Между прочим, svn status не нормально возвращать 0, если нет изменений - ведь этот код возврата просто означает, что ошибок не было.

1 голос
/ 22 сентября 2011

Вы можете проверить номер ревизии с помощью svnversions с kde.org http://websvn.kde.org/trunk/KDE/kdesdk/scripts/svnversions?view=log

0 голосов
/ 30 августа 2014

Вот решение, которое я использовал. Работает с внешними svn и избегает явного перечисления статусов 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 '[^ ]' - первый не пробел подразумевает модификацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...