Что означает символ статуса 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 раньше был файлом, а теперь стал каталогом. Мораль этой истории - не помещайте папку сборки в систему контроля версий.

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

Ответы:

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"
sancelot
источник
Не нужно переименовывать. Вы дали лучший ответ.
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, ссылки меняются на обычные файлы, и это также отображается как ~.

Zbyszanna
источник
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"
Марк Дрюйе
источник
0
~ versioned item obstructed by some item of a different kind
    Second column: Modifications of a file's or directory's properties
Нанхе Кумар
источник