代码之家  ›  专栏  ›  技术社区  ›  Lloeki

在subversion工作副本中重命名目录的明智方法

  •  66
  • Lloeki  · 技术社区  · 15 年前

    每当我需要从“干净”状态重命名SVN工作副本中的目录时,即 svn status 不返回任何内容,所有其他修改都已提交-如so(这是svn doc建议的):

    svn mv foo bar
    svn commit
    

    SVN大声抱怨:

    Adding         bar
    Adding         bar/toto
    Deleting       foo
    svn: Commit failed (details follow):
    svn: Item '/test/foo' is out of date
    

    如你所愿:

    svn update
    

    它给出:

       C foo
    At revision 46.
    Summary of conflicts:
      Tree conflicts: 1
    

    有树冲突,

    svn resolve --accept working -R .
    svn commit
    

    在回购协议上远程重命名它,然后更新我的工作副本,这看起来很愚蠢:

    url=$(svn info | grep -e '^URL:' | sed 's/^URL: //') svn mv $url/foo $url/bar
    svn update
    

    有没有一种认可的、更精简的方法来重命名我丢失的文件夹?这种特别令人惊讶的树冲突状态背后的根本原因是什么?

    4 回复  |  直到 15 年前
        1
  •  69
  •   Albin Sunnanbo    15 年前

    svn mv 对我有用:

    C:\svn\co>svn mv my_dir new_dir
    A         new_dir
    D         my_dir\New Text Document.txt
    D         my_dir
    
    
    C:\svn\co>svn commit -m foo
    Raderar             my_dir
    Lägger till         new_dir
    
    Arkiverade revision 2.
    
    C:\svn\co>
    

    抱歉瑞典输出的svn。

    在你的情况下肯定还有别的问题。

    编辑:
    正如略基在评论中指出的那样

    要再现此行为,还需要更新和提交文件夹中包含的文件,但不更新文件夹本身。

    repo,但本地元数据不是 在任何提交之后记录),因此dir 元数据的版本为n-1。接下来是 元数据差异,它不会更新

    svn rename 命令。

        2
  •  8
  •   Community Mohan Dere    9 年前

    svn mv (移动/重命名)文件;然后提交更改;然后( 没有 svn update 首先, svn commit 更改目录名时-或 accepted answer 放在:“ “但所有这些都是在父目录(或者更确切地说,祖先目录)中执行的。下面的命令行日志演示了该问题:

    $ cd /tmp
    $ svnadmin create myrepo
    $ svn co file:///tmp/myrepo myrepo-wc
    Checked out revision 0.
    
    $ cd myrepo-wc/
    $ mkdir -p dir1/dir2/dir3
    $ svn add dir1/
    A         dir1
    A         dir1/dir2
    A         dir1/dir2/dir3
    
    $ svn ci -m 'add dir1/'
    Adding         dir1
    Adding         dir1/dir2
    Adding         dir1/dir2/dir3
    
    Committed revision 1.
    
    $ echo test1 >> dir1/dir2/dir3/test1.txt
    $ echo test2 >> dir1/dir2/dir3/test2.txt
    $ svn add dir1/
    svn: warning: 'dir1' is already under version control
    $ svn add dir1/*
    svn: warning: 'dir1/dir2' is already under version control
    $ svn add dir1/dir2/dir3/*
    A         dir1/dir2/dir3/test1.txt
    A         dir1/dir2/dir3/test2.txt
    $ svn status
    A       dir1/dir2/dir3/test2.txt
    A       dir1/dir2/dir3/test1.txt
    $ svn ci -m 'add dir1/dir2/dir3/*'
    Adding         dir1/dir2/dir3/test1.txt
    Adding         dir1/dir2/dir3/test2.txt
    Transmitting file data ..
    Committed revision 2.
    
    $ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
    A         dir1/dir2/dir3/test2X.txt
    D         dir1/dir2/dir3/test2.txt
    $ svn status
    D       dir1/dir2/dir3/test2.txt
    A  +    dir1/dir2/dir3/test2X.txt
    $ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
    Deleting       dir1/dir2/dir3/test2.txt
    Adding         dir1/dir2/dir3/test2X.txt
    
    Committed revision 3.
    
    $ svn status
    $ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
    A         dir1/dir2/dir3X
    D         dir1/dir2/dir3/test2X.txt
    D         dir1/dir2/dir3/test1.txt
    D         dir1/dir2/dir3
    $ svn status
    D       dir1/dir2/dir3
    D       dir1/dir2/dir3/test2X.txt
    D       dir1/dir2/dir3/test1.txt
    A  +    dir1/dir2/dir3X
    D  +    dir1/dir2/dir3X/test2.txt
    $ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
    Deleting       dir1/dir2/dir3
    svn: Commit failed (details follow):
    svn: Directory '/dir1/dir2/dir3' is out of date
    $ svn status
    D       dir1/dir2/dir3
    D       dir1/dir2/dir3/test2X.txt
    D       dir1/dir2/dir3/test1.txt
    A  +    dir1/dir2/dir3X
    D  +    dir1/dir2/dir3X/test2.txt
    $ svn up
       C dir1/dir2/dir3
    At revision 3.
    Summary of conflicts:
      Tree conflicts: 1
    

    这就是它应该做的-做一个 svn up 文件移动/重命名完成后;请注意 svn status -v 更改之后 svn更新

    $ cd /tmp
    $ rm -rf myrepo*
    
    $ svnadmin create myrepo
    $ svn co file:///tmp/myrepo myrepo-wc
    Checked out revision 0.
    
    $ cd myrepo-wc/
    $ mkdir -p dir1/dir2/dir3
    $ svn add dir1/
    A         dir1
    A         dir1/dir2
    A         dir1/dir2/dir3
    $ svn ci -m 'add dir1/'
    Adding         dir1
    Adding         dir1/dir2
    Adding         dir1/dir2/dir3
    
    Committed revision 1.
    
    $ echo test1 >> dir1/dir2/dir3/test1.txt
    $ echo test2 >> dir1/dir2/dir3/test2.txt
    $ svn add dir1/dir2/dir3/*
    A         dir1/dir2/dir3/test1.txt
    A         dir1/dir2/dir3/test2.txt
    $ svn status
    A       dir1/dir2/dir3/test2.txt
    A       dir1/dir2/dir3/test1.txt
    $ svn ci -m 'add dir1/dir2/dir3/*'
    Adding         dir1/dir2/dir3/test1.txt
    Adding         dir1/dir2/dir3/test2.txt
    Transmitting file data ..
    Committed revision 2.
    
    $ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
    A         dir1/dir2/dir3/test2X.txt
    D         dir1/dir2/dir3/test2.txt
    $ svn status
    D       dir1/dir2/dir3/test2.txt
    A  +    dir1/dir2/dir3/test2X.txt
    $ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
    Deleting       dir1/dir2/dir3/test2.txt
    Adding         dir1/dir2/dir3/test2X.txt
    
    Committed revision 3.
    
    $ svn status
    $ svn status -v
                     0        0  ?           .
                     1        1 username dir1
                     1        1 username dir1/dir2
                     1        1 username dir1/dir2/dir3
                     3        3 username dir1/dir2/dir3/test2X.txt
                     2        2 username dir1/dir2/dir3/test1.txt
    $ svn up
    At revision 3.
    $ svn status -v
                     3        3 username .
                     3        3 username dir1
                     3        3 username dir1/dir2
                     3        3 username dir1/dir2/dir3
                     3        3 username dir1/dir2/dir3/test2X.txt
                     3        2 username dir1/dir2/dir3/test1.txt
    $ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
    A         dir1/dir2/dir3X
    D         dir1/dir2/dir3/test2X.txt
    D         dir1/dir2/dir3/test1.txt
    D         dir1/dir2/dir3
    $ svn status
    D       dir1/dir2/dir3
    D       dir1/dir2/dir3/test2X.txt
    D       dir1/dir2/dir3/test1.txt
    A  +    dir1/dir2/dir3X
    $ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
    Deleting       dir1/dir2/dir3
    Adding         dir1/dir2/dir3X
    
    Committed revision 4.
    
    $ svn status
    $ svn status -v
                     3        3 username .
                     3        3 username dir1
                     3        3 username dir1/dir2
                     4        4 username dir1/dir2/dir3X
                     4        4 username dir1/dir2/dir3X/test2X.txt
                     4        4 username dir1/dir2/dir3X/test1.txt
    $ svn up
    At revision 4.
    $ svn status -v
                     4        4 username .
                     4        4 username dir1
                     4        4 username dir1/dir2
                     4        4 username dir1/dir2/dir3X
                     4        4 username dir1/dir2/dir3X/test2X.txt
                     4        4 username dir1/dir2/dir3X/test1.txt
    

    正如OP所说-如果有人忘记 在新的move/rename+commit和“commit failed”发生之前,可以使用 svn resolve --accept working -R .

        3
  •  1
  •   xgretsch    13 年前

    这对我有效:

    vi someotherfile
    ...various changes to the other file
    svn mv olddir newdir
    svn commit -m"Moved olddir out of the way" olddir
    svn commit -m"New location of olddir" newdir
    svn update
    svn commit -m"Changed someotherfile" someotherfile
    

    我怀疑还有其他各种可能的方法,在做svn mv之前确保有一个干净的工作目录也可以做到这一点。

        4
  •  0
  •   zellus    15 年前

    人们可以想象这样一个场景:存储库中的目录已被其他用户更改。在提交过程中,重命名工作副本中的同一文件夹可能会触发树冲突。

    Resolving conflicts 演示如何解决subversion中的“树冲突”。

    推荐文章