如何使用svn重命名文件?


83

当我尝试时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 2013年

Answers:


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 statR表示文件已被替换,并且文件具有历史记录。

目标文件已在本地存在(未版本控制):

在这种情况下,本地文件的内容将丢失。如果可以,则可以在重命名现有文件之前在本地删除该文件。

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

我需要在svn rm new_file_name中添加--force,因为它抱怨说new_file不受版本控制。
马修·洛克

..,我必须创建一个名为new_file_name的空文件。
马修·洛克

4
在1.8.3 RM删除物理文件,只需运行“SVN MV ......”就足够了,它执行的是一个D.
索尼克之魂

2
有趣的是,SVN有多旧,以及使用它来重命名文件有多尴尬。
2015年

1
@加桑:问题的标题可能会引起误解。这是关于删除一个文件并同时重命名另一个文件。这种用例并不常见,并且对于大多数VCS来说有点棘手,特别是如果信息在历史记录中应可见的话。
nosid

16

对我来说,使用TortoiseSVN在Windows上很容易工作。

http://tortoisesvn.net/

右键单击文件-> TortoiseSVN菜单->浏览器浏览器->在存储库中右键单击文件->重命名->按Enter->单击确定

使用SVN 1.8.8 TortoiseSVN版本1.8.5


并不是说OP在询问Windows,而是应该对扩展进行扩展:完全的桌面集成意味着您可以在Explorer的上下文菜单中简单地做到这一点。
巴顿

但是现在我看到,在Windows上发布明显是Linux问题的答案已经使这个问题被否决了几次。(草稿,时间用完了,我无法编辑我的原始评论)
Barton

当时我在Windows上使用Cygwin,所以有些交叉。
storm_m2138

如果不在Windows上使用TortoiseSVN,我将无法正常工作。所以我很感谢这个答案。我支持你 使用其他任何东西都会导致它在我更新时随时恢复。在我的情况下,更改是文件名大写。我认为我的问题出在Windows不区分大小写这一事实上。
2015年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.