Як перейменувати файл за допомогою svn?


83

Коли я намагаюся svn mv old_file_name new_file_name, я отримую

 svn: Path 'new_file_name' is not a directory

Який правильний спосіб? (вибачте, це здається таким тривіальним, але я застряг).

PS. за допомогою svn версії 1.6.11

EDIT, здається, я отримую цю помилку, лише якщо new_file_nameпосилається на ім'я файлу, який зараз перебуває під контролем версій. У цьому випадку, звичайно, я можу просто

 mv old_file_name new_file_name
 svn delete old_file_name

Може бути , вам потрібен повний шлях до сховища, file://...або svn://...чи http://...в файл.
Джон Алексіу

Відповіді:


111

Поведінка відрізняється залежно від того, чи ім'я цільового файлу вже існує чи ні. Зазвичай це механізм безпеки, і є принаймні 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.
Matthew Lock

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-браузер -> файл правою кнопкою миші у сховищі -> перейменувати -> натисніть Enter -> натисніть кнопку Ok

Використання SVN 1.8.8 TortoiseSVN версії 1.8.5


Не те, що OP запитував про Windows, але голоси за заслуговують на розширення: Повна інтеграція робочого столу означає, що ви можете просто зробити це в контекстному меню з Explorer.
Barton,

Але зараз я бачу, що розміщення відповіді Windows на те, що є явно питанням Linux, призвело до того, що це питання проголосувало кілька разів. (аркуші, час на редагування мого оригінального коментаря закінчився)
Бартон,

У той час я використовував Cygwin у Windows, тож був певний кросовер.
storm_m2138

Я не міг змусити його працювати, не використовуючи 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.