Что означает символ статуса Subversion «~»?


110

Я получаю символ тильды, когда делаю svn status.

Вот результат работы проекта после редактирования в XCode.

svn status
M      build/Currency_Converter.build/Currency_Converter.pbxindex/imports.pbxbtree
M      build/Currency_Converter.build/Currency_Converter.pbxindex/pbxindex.header
M      build/Currency_Converter.build/Currency_Converter.pbxindex/symbols0.pbxsymbols
~      build/Currency_Converter.build/Currency_Converter.pbxindex/strings.pbxstrings
M      main.m
//more changed files

Есть идеи, что это значит? Кажется, не могу найти его в Google или любой из шпаргалок по svn.

Что интересно, я редактировал только main.m, но есть много измененных файлов. Не знаю, почему это так. У кого-нибудь есть советы по работе с SVN и XCode? Должен ли я помещать только свои исходные файлы под контроль версий?

Изменить: - вызвано тем, что файл, который уже находился под контролем версий, был заменен файлом другого типа. В этом случае strings.pbxstrings раньше был файлом, а теперь стал каталогом. Мораль этой истории - не помещайте папку сборки в систему контроля версий.


Хм, я не уверен, есть ли способ «исправить» это, в отличие от простого повторного добавления. Вы можете задать еще один вопрос, спрашивая, есть ли хороший способ разрешить этот статус, вы привлечете больше внимания (поскольку на текущий вопрос уже дан ответ).
— Чад Берч,

Ответы:


88

В книге SVN говорится:

Элемент версируется как объект одного вида (файл, каталог, ссылка), но был заменен объектом другого типа.

Возможно, изначально это был один файл, но вы изменили его на каталог или что-то в этом роде?


1
Похоже, ты прав. Теперь это каталог без файла .svn. Есть идеи, как это исправить? Мне нужно удалить его из Subversion и добавить снова?
— jergason

есть ли шанс, что вы нашли способ исправить это?
— Фил Паффорд

48
Лучшее решение - переименовать новый объект (в вашем случае каталог); «svn remove» объект из репозитория, который вызывает конфликт (возможно, файл, который вы удалили), зафиксируйте, затем переименуйте новый объект и «svn add» его в репозиторий. Зафиксируйте снова. У вас будет последовательность из 3 ревизий, в которых старый объект существовал, был удален и новый объект был добавлен соответственно.
— Брайан Лейси,

8
Если у кого-то, читающего эту ветку, возникла та же проблема: это случилось со мной, и причиной статуса '~' было то, что у меня были некоторые символические ссылки в репозитории, которые были перезаписаны стандартными файлами с помощью операции 'sed -i' . Я воссоздал символические ссылки, и знак "~" исчез.
— jb

5
@JamieBullock Сегодня то же самое случилось со мной по той же причине. Я попробовал эту команду еще до того, как понял, в чем проблема: svn status | grep ^~ | grep -o [^[:space:]]\*\$ | xargs svn revertкоторая смогла восстановить все символические ссылки.
— Пол

34

Вот что я сделал:

Если папка Test

  1. mv Test Test1
  2. svn remove Test
  3. mv Test1 Test

5
Это работало для меня, пока я делал промежуточные шаги между удалением и добавлением. 1. mv Test Test1 2. svn remove Test 3. svn commit -m «Удаленный тест» 4. mv Test1 Test 5. svn add Test 6. svn commit -m «Добавленный тест»
— Брэндон Броджески 01

1
Ответ @sancelot намного лучше; при использовании переименовывать не нужно svn delete --keep-local fileName.
— DawnSong

15

Из

svn help status

'~' элемент с версией заблокирован каким-то элементом другого типа

Я видел это только тогда, когда права доступа к файлам были изменены, и у svn не было доступа на выполнение, я верю.

Надеюсь это поможет.


12

Самый простой способ исправить это - создать резервную копию, затем удалить папку или файл, имеющий этот статус, а затем выполнить «svn up»: это не обязательно папка, замененная файлом, это может быть просто папка .svn отсутствует или повреждена. .


11
svn delete --keep-local x
svn commit -m "del x"
svn add x
svn commit -m "blah"

Не нужно переименовывать. Вы дали лучший ответ.
— DawnSong

Лучший ответ! Это устраняет проблему. В моем случае это была мягкая ссылка, зафиксированная как обычный файл.

10

Это может произойти, когда вы удаляете папку .svn в папке (например, когда вы удаляете каталог, а затем снова создаете тот же каталог), или когда вы заменяете каталог символической ссылкой или файлом с тем же именем .

Предположим, это папка с именем a-folder, вы можете исправить это, выполнив следующие команды в родительской папке:

$ find a-folder -type d -name '.svn' -print0 | xargs -0 rm -Rf
$ svn up --force .
svn: Directory 'logs/.svn' containing working copy admin area is missing
$ svn up --force .
E    a-folder
...
Updated to revision n.

А затем нужно добавить / удалить svn и снова зафиксировать изменения


3

Была аналогичная проблема, SVN жаловался на блокировку. Вот что мы сделали:

  • Резервное копирование файлов
  • Удалил указанный каталог с помощью rm -r (linux)
  • Ран СВН очистки в каталоге
  • Ran svn up --force в каталоге

3

Я просто хочу сказать, что это проблема, с которой часто сталкиваются при установке расширений в Joomla. Расширения устанавливаются через CMS и принадлежат apache без групповой записи. Как правило, следующим шагом является добавление файлов в SVN, но если вы не выполните sudo или не измените perms файлов, SVN завершится ошибкой, если не сможет записать каталог .svn. Вот простое решение.

mv foo foo-bak
svn up foo
svn revert foo

# just for good measure. Foo should not show up in the two following commands.
ls | grep foo
svn st | grep foo

mv foo-bak foo
svn add foo

2

Также может быть дело в символических ссылках под Windows. Когда вы фиксируете символическую ссылку в SVN, а затем проверяете ее под Windows, ссылки меняются на обычные файлы, и это также отображается как ~.


1
Так как же это исправить?

2

У меня часто было это при обновлении модулей под (например) Joomla !, Wordpress или Drupal. Иногда каталог .svn удаляется в процессе обновления.

# rename updated directory
mv foo foo.new

# restore the old directory
svn up foo

# merge / update the old directory with new items
# notice that the above command will preserve the obsolete files
# so you should do a diff -r in order to remove them
cp -r foo.new/* foo

# Add files commit, etc
svn add foo/*
svn delete foo/xx
svn commit -m "updated module"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.