Jak zmienić nazwę pliku za pomocą svn?


84

Kiedy próbuję svn mv old_file_name new_file_name, dostaję

 svn: Path 'new_file_name' is not a directory

Jaki jest właściwy sposób? (przepraszam, to wydaje się takie trywialne, ale utknąłem).

PS. używając svn w wersji 1.6.11

EDYTUJ Wygląda na to, że otrzymuję ten błąd tylko wtedy, gdy new_file_nameodnosi się do nazwy pliku, który jest obecnie pod kontrolą wersji. W tym przypadku oczywiście mogę po prostu

 mv old_file_name new_file_name
 svn delete old_file_name

Może trzeba pełną ścieżkę repozytorium, file://...czy svn://...lub http://...do pliku.
John Alexiou

Odpowiedzi:


113

Zachowanie różni się w zależności od tego, czy nazwa pliku docelowego już istnieje, czy nie. Zwykle jest to mechanizm zabezpieczający i są co najmniej 3 różne przypadki:

Plik docelowy nie istnieje:

W takim przypadku svn mvpowinno działać w następujący sposób:

$ 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...

Plik docelowy już istnieje w repozytorium:

W takim przypadku plik docelowy musi zostać jawnie usunięty, zanim będzie można zmienić nazwę pliku źródłowego. Można to zrobić w tej samej transakcji w następujący sposób:

$ 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...

W wyjściu svn statThe Rwskazuje, że plik został zastąpiony, a plik ma swoją historię.

Plik docelowy już istnieje lokalnie (niewersjonowany):

W takim przypadku zawartość pliku lokalnego zostanie utracona. Jeśli to jest w porządku, plik można usunąć lokalnie przed zmianą nazwy istniejącego pliku.

$ 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...

Musiałem dodać --force do svn rm nazwa_nowego_pliku, ponieważ narzekał, że nowy_plik nie jest pod kontrolą wersji.
Matthew Lock

.. i musiałem utworzyć pusty plik o nazwie nazwa_nowego_pliku.
Matthew Lock

4
na 1.8.3 rm usuwa fizyczny plik, wystarczy uruchomić "svn mv ...", wykonuje to A D.
Sonic Soul

2
To zabawne, jak stary jest SVN i jak niewygodna jest zmiana nazwy pliku za jego pomocą.
Ghasan

1
@Ghasan: Tytuł pytania może być mylący. Chodzi o usunięcie jednego pliku i zmianę nazwy innego pliku w tym samym czasie. Ten przypadek użycia nie jest tak powszechny i ​​nieco skomplikowany w przypadku większości VCS, w szczególności jeśli informacje powinny być widoczne w historii.
nosid

16

Używanie TortoiseSVN działało z łatwością w systemie Windows dla mnie.

http://tortoisesvn.net/

Kliknij prawym przyciskiem plik -> Menu TortoiseSVN -> Przeglądarka repozytoriów -> kliknij prawym przyciskiem plik w repozytorium -> zmień nazwę -> naciśnij Enter -> kliknij OK

Korzystanie z SVN 1.8.8 TortoiseSVN w wersji 1.8.5


Nie chodzi o to, że OP pytał o system Windows, ale głosy upvotes zasługują na rozszerzenie: pełna integracja z pulpitem oznacza, że ​​możesz to zrobić po prostu w menu kontekstowym z Eksploratora.
Barton

Ale teraz widzę, że opublikowanie odpowiedzi systemu Windows na to, co wyraźnie dotyczy Linuksa, spowodowało, że to pytanie zostało kilkakrotnie odrzucone. (bzdury, skończył mi się czas na zredagowanie mojego oryginalnego komentarza)
Barton

W tym czasie używałem Cygwin na Windowsie, więc było trochę crossover.
storm_m2138

Nie mogłem go zmusić do pracy bez użycia TortoiseSVN w systemie Windows. Jestem więc wdzięczny za tę odpowiedź. Głosowałem za tobą. Używanie czegokolwiek innego powodowało cofanie się przy każdej aktualizacji. W moim przypadku zmiana polegała na pisaniu wielkich liter w nazwach plików. Myślę, że problem w moim przypadku wynika z faktu, że Windows nie rozróżnia wielkości liter.
Jon

1
To działa, ale utracisz historię pliku.
FokTheRock

6

Ten komunikat pojawi się, jeśli używasz systemu plików bez rozróżniania wielkości liter (np. Na komputerze Mac) i próbujesz wpisać wielką literę w nazwie (lub inna zmiana wielkości liter). W takim przypadku musisz zmienić nazwę na trzecią, fikcyjną nazwę:

svn mv file-name file-name_
svn mv file-name_ FILE_Name
svn commit

0

Może tak być, jeśli utworzyłeś nowy katalog na dysku PRZED utworzeniem / zatwierdzeniem go w SVN. Wszystko, czego potrzebujesz, to po prostu utworzyć go w SVN i przejść po:

$ 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

Możesz to zrobić, wykonując 3 kroki:

 - svn rm old_file_name
 - svn add new_file_name
 - svn commit

4
To podejście nie jest dobre, ponieważ powoduje
utratę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.