Как переименовать файл с помощью svn?

84

Когда я пытаюсь svn mv old_file_name new_file_name, я получаю

 svn: Path 'new_file_name' is not a directory

Как правильно? (извините, это кажется таким тривиальным, но я застрял).

PS. с использованием svn версии 1.6.11

ИЗМЕНИТЬ, похоже, я получаю эту ошибку, только если new_file_nameссылаюсь на имя файла, который в настоящее время находится под контролем версий. В этом случае, конечно, я могу просто

 mv old_file_name new_file_name
 svn delete old_file_name
Уолтер
источник
Может вам нужен полный путь к репозиторию, file://...или svn://...или http://...к файлу.
John Alexiou,

Ответы:

113

Поведение различается в зависимости от того, существует ли уже имя целевого файла или нет. Обычно это предохранительный механизм, и существует как минимум 3 разных случая:

Целевой файл не существует:

В этом случае svn mvдолжно работать следующее:

$ svn mv old_file_name new_file_name
A         new_file_name
D         old_file_name
$ svn stat
A  +    new_file_name
        > moved from old_file_name
D       old_file_name
        > moved to new_file_name
$ svn commit
Adding     new_file_name
Deleting   old_file_name
Committing transaction...

Целевой файл уже существует в репозитории:

В этом случае целевой файл необходимо явно удалить, прежде чем исходный файл можно будет переименовать. Это можно сделать в той же транзакции следующим образом:

$ svn mv old_file_name new_file_name 
svn: E155010: Path 'new_file_name' is not a directory
$ svn rm new_file_name 
D         new_file_name
$ svn mv old_file_name new_file_name 
A         new_file_name
D         old_file_name
$ svn stat
R  +    new_file_name
        > moved from old_file_name
D       old_file_name
        > moved to new_file_name
$ svn commit
Replacing      new_file_name
Deleting       old_file_name
Committing transaction...

В выходных данных svn stat, Rуказывает, что файл был заменен, и что у файла есть история.

Целевой файл уже существует локально (неверсирован):

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

$ svn mv old_file_name new_file_name 
svn: E155010: Path 'new_file_name' is not a directory
$ rm new_file_name 
$ svn mv old_file_name new_file_name 
A         new_file_name
D         old_file_name
$ svn stat
A  +    new_file_name
        > moved from old_file_name
D       old_file_name
        > moved to new_file_name
$ svn commit
Adding         new_file_name
Deleting       old_file_name
Committing transaction...
носид
источник
Мне нужно было добавить --force к svn rm new_file_name, поскольку он жаловался, что new_file не находится под контролем версий.
Мэтью Лок
.. и мне пришлось создать пустой файл с именем new_file_name.
Мэтью Лок
4
на 1.8.3 rm удаляет физический файл, достаточно просто запустить "svn mv ...", он выполняет это A D.
Sonic Soul
2
Забавно, сколько лет SVN и как неудобно переименовывать файл с его помощью.
Ghasan
1
@Ghasan: Название вопроса может вводить в заблуждение. Речь идет об удалении одного файла и одновременном переименовании другого файла. Этот вариант использования не так распространен и немного сложен с большинством VCS, в частности, если информация должна быть видна в истории.
nosid
16

Для меня TortoiseSVN легко работал в Windows.

http://tortoisesvn.net/

Щелкните правой кнопкой мыши файл -> меню TortoiseSVN -> Repo-browser -> щелкните правой кнопкой мыши файл в репозитории -> переименовать -> нажмите Enter -> нажмите Ok

Использование SVN 1.8.8 TortoiseSVN версии 1.8.5

storm_m2138
источник
Не то, чтобы OP спрашивал о Windows, но голоса за заслуживают расширения: полная интеграция с рабочим столом означает, что вы можете просто сделать это в контекстном меню из проводника.
Бартон
Но теперь я вижу, что публикация ответа Windows на вопрос, который явно является вопросом Linux, несколько раз отвергала этот вопрос. (чертовски, время для редактирования моего исходного комментария истекло)
Бартон
В то время я использовал Cygwin в Windows, поэтому был некоторый переход.
storm_m2138 08
Я не мог заставить его работать без TortoiseSVN в Windows. Так что я благодарен за этот ответ. Я за тебя проголосовал. Использование чего-либо еще заставляло его возвращаться в любое время, когда я обновлялся. В моем случае изменение заключалось в использовании заглавных букв в именах файлов. Я думаю, что проблема в моем случае связана с тем, что Windows нечувствительна к регистру.
Джон
1
Это работает, но вы потеряете историю файла.
FokTheRock
6

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

svn mv file-name file-name_
svn mv file-name_ FILE_Name
svn commit
суперк
источник
0

Это может быть, если вы создали новый каталог на диске ДО того, как создать / зафиксировать его в SVN. Все, что вам нужно, это просто создать его в SVN и двигаться после:

$ svn mv etc/nagios/hosts/us0101/cs/us0101ccs001.cfg etc/nagios/hosts/us0101/ccs/
svn: E155010: Path '/home/dyr/svn/nagioscore/etc/nagios/hosts/us0101/ccs' is not a directory

$ svn status
?       etc/nagios/hosts/us0101/ccs

$ rm -rvf etc/nagios/hosts/us0101/ccs
removed directory 'etc/nagios/hosts/us0101/ccs'

$ svn mkdir etc/nagios/hosts/us0101/ccs
A         etc/nagios/hosts/us0101/ccs

$ svn move etc/nagios/hosts/us0101/cs/us0101ccs001.cfg etc/nagios/hosts/us0101/ccs/us0101accs001.cfg
A         etc/nagios/hosts/us0101/ccs/us0101accs001.cfg
D         etc/nagios/hosts/us0101/cs/us0101ccs001.cfg

$ svn status
A       etc/nagios/hosts/us0101/ccs
A  +    etc/nagios/hosts/us0101/ccs/us0101accs001.cfg
        > moved from etc/nagios/hosts/us0101/cs/us0101ccs001.cfg
D       etc/nagios/hosts/us0101/cs/us0101ccs001.cfg
        > moved to etc/nagios/hosts/us0101/ccs/us0101accs001.cfg
Денис Юсупов
источник
-4

Вы можете сделать это, выполнив 3 шага:

 - svn rm old_file_name
 - svn add new_file_name
 - svn commit
Прадип Дас
источник
4
Такой подход не годится, потому что он теряет историю файла
user2913094,