SVN存储库中的"幻影"目录
我以某种方式设法使SVN信息库进入不良状态。我已经移动了目录,但现在无法在新位置提交它。
就" svn status"而言,该目录是未知的(目录的名称为" type")。
$ svn status ? type
当我尝试添加目录时,服务器说它已经存在。
$ svn add type svn: warning: 'type' is already under version control
如果我尝试更新目录,它将再次消失。
$ svn update type svn: '.' is not under version control
如果我尝试提交它,服务器将抱怨它的旧父目录已不存在。
$ svn commit type -m "Moving type" svn: Commit failed (details follow): svn: '/prior/trunk/src/nyu/prior/cvc3/theorem_prover/expression' path not found
为了增加神秘性,该目录的内容被标记为已修改。
$ svn status type A + type M + type/IntegerType.java M + type/BooleanType.java M + type/Type.java M + type/RationalRangeType.java M + type/RationalType.java M + type/IntegerRangeType.java
如果我尝试从目录中进行更新,则会得到此信息。
$ cd type $ svn update svn: Two top-level reports with no target
从目录中提交会产生与上述相同的"找不到路径"错误。
怎么回事,我该如何解决?
编辑:@Rob Oxspring吸引了我:我在Eclipse中四处走动过于激进。
更新:我接受@Rob Oxspring的回答"不要那样做/只是重新开始",并接受他的建议。如果有人能告诉我,我仍然很感兴趣:(a)以上错误消息的确切含义,以及(b)如何真正解决问题。
解决方案
回答
我们是从仅使用OS命令复制/移动目录开始的,还是从SVN内容开始的?如果仅通过OS复制文件,则仍将具有包含指向旧位置的SVN信息的隐藏文件夹。
回答
修复许多SVN错误的简单方法是通过操作系统将整个目录移开,进行更新以获取该目录的另一个干净副本,然后将我们使用某些其他工具(例如WinMerge或者类似工具)更改的内容合并到一起。
在那之后,我们可以做我们想做的任何事情,但是要正确做:)。
回答
我的经验是,有时本地副本与存储库不同步。我通常通过在本地目录树中解决问题来解决此问题,从出现问题的目录开始,并尝试执行清理和每一步更新。
回答
在我看来," type"是由某个了解Subversion的复制命令创建的,然后使用不了解Subversion的副本移动到当前目录。以我的经验,当包重构操作在Eclipse中链接在一起而没有提交时,通常会发生这种情况。通常,当我们复制/移动本地复制/移动的文件或者文件夹时,Subversion不能很好地处理它,尽管我认为1.5版可能会更好。
为了将来避免这种情况,请在这些步骤之间进行确认。如果我们想隐藏中间的提交,那么我建议我们在分支上进行多步重构,然后将更改合并回主行中。
如果工作量不大,那么建议我们回到干净的工作副本中并重做更改,并在每个步骤之后进行确认。如果我们很乐意丢失历史记录,即允许新的IntegerType.java根本不链接到旧的IntegerType.java,那么我们可以采用BCS建议的方法:
- 将更改后的文件移动到某个临时位置,删除所有
.svn
目录 - 将工作副本更新为干净的工作状态
- 将更改复制回我们想要的位置
- 提交生成的工作副本
回答
我建议删除(在subversionso之外,使用rm或者类似名称)测试上面的目录,然后在该目录中运行svn update。
也就是说,如果我们不想像其他人所建议的那样获得一个全新的工作副本,那可能是最安全的方法。
回答
发生的事情是,我们先签出了一个文件夹,然后在本地" svn添加"和/或者修改了该文件夹中的某些内容,但是在我们提交更改之前,原始文件夹已从SVN中移动(或者删除)了资料库。
我们需要做的就是将当前结帐切换到SVN信息库中的新位置。因此,假设我们已经从path / to / folder1 / foo签出了foo文件夹,并且foo被移到了path / to / foo,那么我们只需要运行:
$ svn switch path/to/foo
而已... ;-)