2012-05-19 4 views
3

В моем проекте у меня есть папка с ресурсами, которые я не хочу вручную добавлять или удалять в репозиторий, когда я добавляю или удаляю их в свою рабочую копию.Ошибка «файл не существует» ошибка svn remove

Я написал простой скрипт Баш, который проверяет svn state и вызывает svn add для файлов, помеченных ? и svn remove для файлов с !. Я добавил этот сценарий bash к моему сценарию сборки. Проблема заключается в том, что svn remove возвращает ошибку при вызове с файлом, который больше не существует локально. Это приводит к тому, что мой скрипт сборки прерывается и возвращает ошибку.

Есть ли способ подавить эти ошибки? Я пробовал --force и --quiet. Не помогло.

Пример:

MacBook-Pro:proj Bill$ echo "test" > foo.bar 
MacBook-Pro:proj Bill$ svn st 
?  foo.bar 
MacBook-Pro:proj Bill$ svn add foo.bar 
A   foo.bar 
MacBook-Pro:proj Bill$ rm foo.bar 
MacBook-Pro:proj Bill$ svn st 
!  foo.bar 
MacBook-Pro:proj Bill$ svn rm foo.bar 
D   foo.bar 
svn: 'foo.bar' does not exist 
+0

Я использую svn версию 1.6.17 на OS X 10.7. Я обновил свой пост на примере. Если нет стандартного способа сделать это с помощью svn, я думаю, что я просто отправлю 'stderr' в'/dev/null'. – DrummerB

+0

Ну, это тоже не помогло. Я предполагаю, что проблема заключается не в самом сообщении об ошибке, а в возвращаемом значении 'svn rm'. – DrummerB

+0

'-keep-local' сделал трюк. – DrummerB

ответ

4

Есть (по крайней мере) два различных случая, в которых svn stat печатает строку с восклицательным знаком:

  1. файл существует в хранилище, не существует в рабочем каталоге, и svn rm не использовался.
  2. Файл не существует в репозитории, svn add был использован в файле, и файл больше не существует в рабочем каталоге.

svn rm работает в первом случае, но выходит с ошибкой во втором случае. Есть несколько способов решить эту проблему - в зависимости от того, что вы хотите достичь:

  • Если вы хотите удалить файл в обоих случаях, сделайте следующее:
    touch "$filename" ; svn rm --force "$filename".
  • Если вы хотите удалить файл только во втором случае и вернуться в первом случае, выполните следующие действия:
    svn revert "$filename".
+0

Спасибо, это еще более элегантное решение. – DrummerB

3

Таким образом, чтобы ответить на мой вопрос, используя --keep-local исправили проблему.

Вот сценарий, который я использовал. Это проверит файлы, помеченные как not versioned (?), и вызовет для них svn add. Затем он проверяет файлы, отмеченные как отсутствующие (!), и звоните svn rm для них.

svn st "$Resources" | grep '^?' | sed 's_^?  \(.*\)$_svn add "\1"_g' | sh 
svn st "$Resources" | grep '^!' | sed 's_^!  \(.*\)$_svn rm --keep-local "\1"_g' | sh 
Смежные вопросы