Каталоги "Phantom" в репозитории 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
, что и выше.
Что происходит и как его исправить?
EDIT: @Rob Oxspring поймал меня: я слишком агрессивно двигался вокруг в Eclipse.
ОБНОВЛЕНИЕ: Я принимаю ответ @Rob Oxspring "не делай этого/просто начинаешь" и беря его совет. Мне все равно было бы интересно, если бы кто-нибудь мог сказать мне: (а) то, что означают вышеприведенные сообщения об ошибках, и (б) как исправить проблему.
Ответы
Ответ 1
Мне кажется, что type
был создан некоторой командой копирования Subversion, а затем переместился в текущий каталог с использованием копии Subversion-unaware. По моему опыту, такого рода вещи обычно возникают, когда операции рефакторинга пакетов соединены вместе в Eclipse без коммиттов между ними. Как правило, Subversion не справляется с этим, когда вы копируете/перемещаете скопированный/перемещенный файл или папку, хотя я думаю, что версия 1.5 может справиться с ней лучше.
Чтобы избежать этого в будущем, сделайте фиксацию между такими шагами. Если вы хотите скрыть промежуточные коммиты, я бы рекомендовал делать многоэтапный рефакторинг на ветке, а затем объединять изменения обратно в основную линию в том единственном, что вы были после.
Если это не так много, я бы рекомендовал вернуться к чистой рабочей копии и переделать ваши изменения, совершив после каждого шага. Если вы счастливы потерять историю, то есть позволить новому IntegerType.java
не связываться вообще со старым IntegerType.java
, тогда вы можете воспользоваться предложенным BCS подходом:
- Переместите ваши измененные файлы в какое-то временное место, удалив все каталоги
.svn
- Обновите рабочую копию в рабочем состоянии
- Скопируйте свои изменения обратно туда, где вы хотите.
- Зафиксировать полученную рабочую копию
Ответ 2
Легкий способ исправить множество ошибок SVN - это переместить весь каталог через ОС, обновить, чтобы получить еще одну чистую копию, а затем объединить все, что вы изменили, с помощью какого-либо другого инструмента, WinMerge или тому подобного.
После этого вы можете делать все, что вы пытаетесь сделать, но делайте это правильно:).
Ответ 3
Вы начали, просто скопировав/переместив каталог с командами ОС, или вы начали с файлов SVN? Если вы просто скопировали файлы через ОС, у вас все равно были бы скрытые папки, содержащие информацию SVN, указывающую на старое местоположение.
Ответ 4
Я бы предложил, чтобы удалить (вне subversionso с rm или аналогичным), в приведенной выше директории, а затем запустить там svn update.
То есть, если вы не хотите получать совершенно новую рабочую копию, как предложили другие, что может быть самым безопасным подходом.
Ответ 5
У меня была такая же проблема. Я исправил его, удалив папку .svn
из зараженной папки.
Ответ 6
Мой опыт в том, что иногда локальная копия не синхронизируется с репозиторием. Обычно я решаю это, переходя в локальное дерево каталогов, начиная с каталога с проблемой и пытаюсь сделать очистку и обновление с каждым шагом.
Ответ 7
Что случилось, так это то, что вы сделали проверку папки, затем локально 'svn добавили и/или внесли изменения в/в эту папку, но прежде чем вы внесете изменения, исходная папка была перемещена (или удалена) из хранилища SVN.
Все, что вам нужно сделать, - это переключить текущую проверку на новое место в репозитории SVN. Итак, предположим, что у вас есть чек из папки foo из path/to/folder1/foo, и что foo был перемещен в path/to/foo, вам просто нужно запустить:
$ svn switch path/to/foo
Что это...; -)