一种在subversion工作副本中重命名目录的合理方法

Llo*_*eki 68 svn directory rename

虽然不知何故精通VCS(常规的svn,git和git-svn用户),我似乎无法围绕这种奇特的SVN行为.

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

svn mv foo bar
svn commit
Run Code Online (Sandbox Code Playgroud)

SVN大声抱怨:

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

如你所愿:

svn update
Run Code Online (Sandbox Code Playgroud)

这使:

   C foo
At revision 46.
Summary of conflicts:
  Tree conflicts: 1
Run Code Online (Sandbox Code Playgroud)

存在树冲突,而没有发生第三方更改.显然,摆脱这种树冲突混乱的唯一方法是一般(来自svn红皮书):

svn resolve --accept working -R .
svn commit
Run Code Online (Sandbox Code Playgroud)

在repo上远程重命名它然后更新我的工作副本似乎很头脑:

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

是否有一个受制裁的,更简化的方法来重命名我缺少的文件夹?特别令人惊讶的树木冲突状态背后的根本原因是什么?

Alb*_*nbo 69

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>
Run Code Online (Sandbox Code Playgroud)

对不起svn的瑞典语输出.

在你的情况下肯定有其他错误.

编辑:
正如Lloeki的评论所指出的那样

要重现该行为,您还需要更新并提交文件夹中包含的文件,但不要更新文件夹本身.

文件提交在repo上创建一个新的rev,但是本地元数据不会更新(因为它始终是,在任何提交后参见svn log),因此dir元数据是rev n-1.因此,由于元数据差异,svn将不会提交,并且它不会更新,因为dir确实存在冲突:更新元数据与删除.

行为是"预期的","解决方案"是在发出svn rename命令之前更新工作副本.

  • 找到"别的东西"实际上是问题的一部分:)现在修改New Text Document.txt,提交它,然后再修改dir并再次提交. (2认同)
  • 我最终找到了原因,它以一种颠覆的方式变得有意义:文件提交在repo上创建了一个新的rev*n*,但是本地元数据没有更新(因为它始终是,在任何提交后参见`svn log`),因此dir元数据是rev*n-1*.因此,由于元数据差异,svn将不会提交,并且它不会更新,因为dir确实存在冲突:更新元数据与删除. (2认同)

sda*_*aau 8

好吧,我碰到了这个 - 并且最终可以通过一个简单的终端会话重建问题:如果你svn mv(移动/重命名)一个文件就会出现问题; 然后承诺改变; 然后(没有svn update第一个),svn mv移动/重命名以前提交的文件的父目录 - 最后做一个svn commit关于更改目录名称 - 或作为接受的答案把它:" 你还需要更新并提交一个包含在文件夹中的文件,但不更新文件夹本身 "; 但所有这些都在父(或更确切地说,祖先)目录中执行.这是命令行日志演示问题:

$ 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
Run Code Online (Sandbox Code Playgroud)

这就是它应该如何 - svn up在文件移动/重命名之后进行一次; 请注意命令svn status -v后更改报告的版本号svn update:

$ 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
Run Code Online (Sandbox Code Playgroud)

正如OP所说 - 如果svn update在新的移动/重命名+提交之前忘记执行操作,并且发生"提交失败" - 那么可以使用svn resolve --accept working -R .以完成提交操作.