【问题标题】:How to rename a file using svn?如何使用 svn 重命名文件?
【发布时间】:2013-06-24 16:04:20
【问题描述】:

当我尝试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://... 到文件。

标签: svn


【解决方案1】:

根据目标文件名是否已经存在,行为会有所不同。它通常是一种安全机制,至少有 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 的空文件。
  • on 1.8.3 rm 删除物理文件,只运行“svn mv ...”就足够了,它执行A D。
  • 有趣的是 SVN 有多古老,使用它重命名文件是多么尴尬。
  • @Ghasan:问题的标题可能具有误导性。它是关于删除一个文件并同时重命名另一个文件。这个用例并不常见,而且对于大多数 VCS 来说有点棘手,特别是如果信息应该在历史记录中可见。
【解决方案2】:

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

http://tortoisesvn.net/

右键文件 -> TortoiseSVN 菜单 -> Repo-browser -> 右键单击​​存储库中的文件 -> 重命名 -> 按 Enter -> 点击确定

使用 SVN 1.8.8 TortoiseSVN 1.8.5版

【讨论】:

  • 并不是说 OP 询问的是 Windows,但赞成票值得扩展:完全桌面集成意味着您可以简单地在资源管理器的上下文菜单中执行此操作。
  • 但现在我看到,发布一个关于显然是 Linux 问题的 Windows 答案已经让这个问题多次被否决。 (drats,我没有时间编辑我的原始评论了)
  • 当时我在 Windows 上使用 Cygwin,所以有一些交叉。
  • 如果不在 Windows 上使用 TortoiseSVN,我无法让它工作。所以我很感谢这个答案。我给你投了赞成票。使用其他任何东西都会导致它在我更新时恢复。就我而言,更改是文件名的大写。我认为我的问题源于 Windows 不区分大小写。
  • 这样可以,但您会丢失文件的历史记录。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果您在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2020-04-03
      • 2011-01-30
      • 2011-03-30
      • 2012-06-01
      相关资源
      最近更新 更多