"Фантомные" каталоги в репозитории SVN

Мне как-то удалось привести репозиторий SVN в плохое состояние. Я переместил каталог и теперь не могу зафиксировать его в новом месте.

Что касается svn status, каталог неизвестен (имя каталога type).

$ svn status
?      type

Когда я пытаюсь добавить каталог, сервер сообщает, что он уже существует.

$ svn add type
svn: warning: 'type' is already under version control

Если я попытаюсь обновить каталог, он снова исчезнет.

$ svn update type
svn: '.' is not under version control

Если я попытаюсь зафиксировать его, сервер пожалуется, что его старый родительский каталог больше не существует.

$ svn commit type -m "Moving type"
svn: Commit failed (details follow):
svn: '/prior/trunk/src/nyu/prior/cvc3/theorem_prover/expression' path not found

Чтобы добавить к тайне, содержимое каталога помечено как измененное.

$ svn status type
A  +   type
M  +   type/IntegerType.java
M  +   type/BooleanType.java
M  +   type/Type.java
M  +   type/RationalRangeType.java
M  +   type/RationalType.java
M  +   type/IntegerRangeType.java

Если я попытаюсь выполнить обновление из каталога, я получу это.

$ cd type
$ svn update
svn: Two top-level reports with no target

Фиксация из каталога дает ту же ошибку path not found, что и выше.

Что происходит и как мне это исправить?

Обновлено: @Rob Oxspring поймал меня: я стал слишком агрессивно перемещать вещи в Eclipse.

ОБНОВЛЕНИЕ: я принимаю ответ @Rob Oxspring «не делайте этого / просто начинайте заново» и следую его совету. Мне все равно было бы интересно, если бы кто-нибудь мог сказать мне: (а) что именно иметь в виду вышеприведенных сообщений об ошибках и (б) как на самом деле исправить проблема.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
11 771
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы начали с простого копирования / перемещения каталога с помощью команд ОС или начали с SVN? Если вы просто скопировали файлы через ОС, у вас все равно остались бы скрытые папки, содержащие информацию SVN, указывающую на старое местоположение.

Спасибо. Этот ответ просто заставил меня понять, что я сделал (хотя я использовал Eclipse для перемещения каталога. Вы могли подумать, что Eclipse сделает это правильно. Какой беспорядок, чтобы убрать, но вы заставили меня двигаться в правильном направлении. жизнь.

Marvo 08.06.2011 10:09

Самый простой способ исправить многие ошибки SVN - переместить весь каталог через ОС, обновить его, чтобы получить еще одну чистую копию, а затем объединить все, что вы изменили, с помощью другого инструмента, WinMerge или подобного.

После этого вы можете делать все, что пытались сделать, но делать это правильно :).

Мой опыт показывает, что иногда локальная копия не синхронизируется с репозиторием. Обычно я решаю эту проблему, поднимаясь по дереву локальных каталогов, начиная с каталога, в котором возникла проблема, и пытаюсь выполнять очистку и обновление на каждом этапе.

Ответ принят как подходящий

Мне кажется, что type был создан какой-то командой копирования с поддержкой Subversion, а затем перемещен в текущий каталог с помощью копии, не поддерживающей Subversion. По моему опыту, такого рода вещи обычно возникают, когда операции рефакторинга пакетов связаны в Eclipse без промежуточных коммитов. Обычно Subversion плохо справляется с этим, когда вы копируете / перемещаете локально скопированный / перемещенный файл или папку, хотя я думаю, что версия 1.5 может справиться с этим лучше.

Чтобы избежать этого в будущем, выполняйте фиксацию между такими шагами. Если вы хотите скрыть промежуточные коммиты, я бы порекомендовал выполнить многоэтапный рефакторинг в ветке, а затем объединить изменения обратно в основную линию в той единственной фиксации, которую вы сделали.

Если это не слишком много работы, я бы рекомендовал вернуться к чистой рабочей копии и повторить свои изменения, фиксируя после каждого шага. Если вы счастливы потерять историю, т.е. позволить новому IntegerType.java вообще не связываться со старым IntegerType.java, то вы можете воспользоваться подходом, предложенным BCS:

  • Переместите измененные файлы во временное место, удалив все каталоги .svn.
  • Обновите вашу рабочую копию до чистого рабочего состояния
  • Скопируйте свои изменения туда, где вы хотите, чтобы они были
  • Зафиксируйте получившуюся рабочую копию

Я бы посоветовал удалить (вне subversion, например, с помощью rm или аналогичного) каталог выше test, а затем запустить там svn update.

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

Произошло то, что вы выполнили проверку папки, а затем локально svn добавили и / или изменили что-то в / в этой папке, но до того, как вы зафиксировали свои изменения, исходная папка была перемещена (или удалена) из SVN репозиторий.

Все, что вам нужно сделать, это переключить текущую кассу на новое место в репозитории SVN. Итак, предположим, что у вас есть проверка папки foo из пути / в / folder1 / foo, и этот foo был перемещен в путь / в / foo, вам просто нужно запустить:

$ svn switch path/to/foo

Вот и все... ;-)

Звучит разумно. К сожалению, у меня сейчас нет обновленной рабочей копии, чтобы протестировать ее ... ;-)

Chris Conway 12.12.2009 19:27

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

Другие вопросы по теме