如何使用svn重命名文件?

96

当我尝试使用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
4个回答

124

行为取决于目标文件名是否已经存在。通常这是一种安全机制,并且至少有三种不同的情况:

目标文件不存在:

在这种情况下,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...

我需要在 svn rm new_file_name 命令中添加 --force 参数,因为它提示 new_file 不在版本控制之下。 - Matthew Lock
...然后我需要创建一个名为new_file_name的空文件。 - Matthew Lock
4
在1.8.3版本中,rm命令会删除物理文件,但运行"svn mv..."命令就足够了,它会执行A D操作。 - Sonic Soul
2
有趣的是,SVN 已经很老了,使用它重命名文件时非常笨拙。 - Ghasan غسان
1
@Ghasan:问题的标题可能会误导人。它是关于同时删除一个文件和重命名另一个文件的问题。这种用例并不常见,而且对于大多数版本控制系统来说都有点棘手,特别是如果要在历史记录中显示信息的话。 - nosid
对我来说,只需键入 svn mv old_file_name new_file_name 即可解决问题。然后我用 stat 检查并提交了它。(我正在重命名一个已经存在的文件。)非常有帮助,谢谢。 - Joe

18

我很容易地在Windows上使用TortoiseSVN。

http://tortoisesvn.net/

右键单击文件 -> TortoiseSVN菜单 -> Repo-browser -> 在仓库中右键单击文件 -> 重命名 -> 按Enter键 -> 点击Ok

使用SVN 1.8.8 TortoiseSVN版本号为1.8.5


请注意,OP并没有询问Windows相关的问题,但是点赞值得推广:完整的桌面集成意味着您可以在资源管理器的上下文菜单中轻松完成此操作。 - Barton
但是现在我看到,在显然是一个Linux问题的情况下发布Windows答案已经导致这个回答被多次投票否决了。(糟糕,时间已经用完了,我无法编辑我的原始评论) - Barton
当时我在Windows上使用Cygwin,所以有一些交叉。 - storm_m2138
我在Windows上无法在不使用TortoiseSVN的情况下使其正常工作。所以我很感谢这个答案。我给你点赞了。使用其他任何东西都会导致每次更新时都会还原。在我的情况下,更改是文件名的大小写。我认为在我的情况下问题源于Windows不区分大小写。 - Jon
1
这样做可以实现,但是您将会失去文件的历史记录。 - FokTheRock
那么,对于在其工作副本中拥有old_file_name的用户会发生什么? - Luke

8

如果您正在使用不区分大小写的文件系统(例如在 Mac 上),并且您正在尝试将名称(或更改大小写等)大写,则会出现此消息。在这种情况下,您需要将其重命名为第三个虚拟名称:

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

我在想为什么它在Linux上可以工作,但在Mac上却不行。谢谢! - stefan.gal

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接