SVN存储库中的"幻影"目录

时间:2020-03-05 18:48:34  来源:igfitidea点击:

我以某种方式设法使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

而已... ;-)