Странная проблема с Subversion - «Файл уже существует» при попытке воссоздать каталог, который ИСПОЛЬЗУЕТСЯ в моем хранилище - PullRequest
70 голосов
/ 11 сентября 2009

Итак - у меня был каталог mysql несколько ревизий назад. Я удалил его и решил начать все сначала - но когда я пытаюсь создать новый каталог mysql - я продолжаю сталкиваться с ошибкой «Файл уже существует»:

support:/etc/puppet/modules# mkdir mysql
support:/etc/puppet/modules# svn add mysql/
A         mysql
support:/etc/puppet/modules# svn commit -m " Test"
Adding         modules/mysql
svn: Commit failed (details follow):
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-r', path '/trunk/modules/mysql'
support:/etc/puppet/modules# svn delete mysql
svn: Use --force to override this restriction
svn: 'mysql' has local modifications
support:/etc/puppet/modules# svn --force delete mysql
D         mysql

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

support:/etc/puppet/modules# svn status
support:/etc/puppet/modules# svn update
At revision 11.
support:/etc/puppet/modules# svn mkdir mysql
A         mysql
support:/etc/puppet/modules# svn commit -m "Test"
Adding         modules/mysql
svn: Commit failed (details follow):
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-s', path '/trunk/modules/mysql'

Ответы [ 14 ]

62 голосов
/ 24 октября 2009

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

После некоторого разочаровывающего возни, я обнаружил, что должен:
(с использованием TortoiseSVN в Windows)

  1. Перемещение конфликтующих папок из рабочей копии (чтобы я не терял свою незавершенную работу)
  2. Сделайте svn update, который добавил старые файлы / папки обратно в рабочую копию
  3. svn delete папка
  4. commit
  5. Скопировать новую папку обратно в рабочую копию (убедитесь, что вы удалили все папки .svn внутри)
  6. commit

К сожалению, это (A) требует двух коммитов, и (B) теряет историю изменений файлов, поскольку отслеживает только недавнее повторное добавление (если кто-то не может объяснить, как это исправить). Альтернативное решение, позволяющее обойти эти 2 проблемы, - это пропустить шаги 3 и 4 , единственная проблема заключается в том, что старые / ненужные файлы могут все еще присутствовать в вашем каталоге. Вы можете удалить их вручную.

Хотелось бы услышать любые дополнительные идеи, которые другие могут иметь по этому поводу.

Simon.


[Обновить] ОК, у меня снова возникла та же проблема, но папка-нарушитель НЕ была в последнем коммите, поэтому update не восстановил ее. Вместо этого мне пришлось просмотреть репозиторий и delete папку с ошибками . Затем я мог бы add вернуть папку обратно и commit успешно.

17 голосов
/ 30 января 2012

Была похожая проблема. Чтобы решить эту проблему, обновлено из svn trunk с возможностью приоритета локальных файлов.

svn update path/ --accept=mine-full

После того, как Вы могли совершить как обычно. Конечно, будьте осторожны, используя его.

12 голосов
/ 11 сентября 2009

уже имел такой тип проблемы.

мое решение было:

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

#!/bin/bash

find -name '.svn' | while read directory;
do
    echo $directory;
    rm -rf "$directory";
done;

удалить локальный репозиторий и заново проверить весь проект. не знаю, достаточно ли частичное удаление / извлечение.

1010 * привет *

11 голосов
/ 11 сентября 2009

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

7 голосов
/ 24 декабря 2010

Это неприятная ... загадочная ошибка и неясного исправления.

update / revert / commit НЕ работало в моей ситуации. Я не сделал ничего странного - просто несколько движений SVN.

Что ДЕЙСТВИТЕЛЬНО для меня было:

svn remove offender
svn commit
cd ..
rm -fR parent
svn up parent
cd parent
svn remove offender again
svn commit
copy offender back in (minus .svn dirs)
svn add
svn commit

Странно, если не сказать больше. По сути, svn remove --force offender по какой-то причине не делал полного удаления. Что-то вроде того, что говорилось в сообщении об ошибке. Только удалив родителя, затем обновив родителя, это стало очевидным, потому что тогда преступник снова появился! svn снова удаляет нарушителя, а затем удаляет его правильно.

1 голос
/ 17 января 2014

Я столкнулся с этой проблемой сегодня, когда произошел сбой Xcode во время слияния веток. Каким-то образом файл был загружен в репозиторий svn, но он не был должным образом записан в базу данных svn. Я выполнил следующие команды в каталоге, где файл существовал локально:

svn revert bad.file
svn del svn://my.svnserver.com/svnDB/path/to/the/offending/file/bad.file

Затем я заново добавил файл из моей локальной системы:

svn add bad.file
svn commit -m "Re adding bad.file"

Успех!

1 голос
/ 10 февраля 2012

Это решение плавно сливается и не теряет историю:

  1. Переместить / рабочую копию / правонарушителя во временное местоположение.
  2. Выполните svn-проверку svn + ssh: //svn.example.com/repo/offender to /working-copy/offender.
  3. Вручную переместите ваши файлы из временного местоположения в новую кассу.
  4. Удалить временное местоположение.
1 голос
/ 06 октября 2011

У меня была эта проблема в проекте, который я запускаю на Netbeans. Я просто щелкнул правой кнопкой мыши по файлу и обновил, чтобы исправить его (после запуска SVN).

1 голос
/ 10 ноября 2010
  1. переименуйте новый путь в temp
  2. вернуть новый путь (не временный!), Чтобы svn не пытался его зафиксировать
  3. оставьте ваши изменения
  4. скопировать путь внутри хранилища: svn copy -m "скопированный путь" -r
  5. обновить вашу рабочую копию
  6. mv все файлы от временного до нового пути, который приходит из обновления
  7. зафиксировать ваши локальные изменения после ревизии
  8. Хорошего дня, включая историю; -)
1 голос
/ 11 сентября 2009

Я не уверен, помогает ли это вам, но я предполагаю, что когда вы сделаете svn add mysql после того, как удалите его, он просто восстановит каталог (так что не создавайте mkdir самостоятельно). Если вы создаете каталог самостоятельно, svn ожидает каталог .svn внутри него, потому что он уже «знает» об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...