SVN存储库中的“Phantom”目录

时间:2008-09-05 22:47:47

标签: 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

从目录中提交会产生与上述相同的path not found错误。

发生了什么,我该如何解决?

编辑:@Rob Oxspring把我抓了出来:我在Eclipse中过于咄咄逼人。

更新:我接受@Rob Oxspring的答案“不要那样做/刚刚重新开始”并接受他的建议。如果有人能告诉我,我仍然感兴趣:(a)上述错误消息意味着什么,(b)如何实际修复问题。

7 个答案:

答案 0 :(得分:14)

我认为type是由某些Subversion-aware复制命令创建的,然后使用Subversion-unaware副本移动到当前目录中。根据我的经验,当包重构操作在Eclipse中链接在一起而没有在它们之间进行提交时,通常会发生这种情况。通常,当您复制/移动本地复制/移动的文件或文件夹时,Subversion不能很好地处理它,尽管我认为版本1.5可以更好地处理它。

为了避免将来这样做,请在这些步骤之间进行。如果您想隐藏干预提交,那么我建议您在分支上执行多步重构,然后将更改合并到您所追求的单个提交中的主线中。

如果这不是太多的工作,那么我建议你回到一个干净的工作副本并重做你的更改,在每一步之后提交。如果您很高兴丢失历史记录,即允许新的IntegerType.java根本不与旧的IntegerType.java相关联,那么您可以采用BCS建议的方法:

  • 将更改的文件移动到某个临时位置,删除任何.svn目录
  • 将您的工作副本更新为干净的工作状态
  • 将您的更改复制回您希望的更改
  • 提交生成的工作副本

答案 1 :(得分:9)

修复许多SVN错误的简单方法是通过操作系统移动整个目录,更新以获得它的另一个干净副本,然后使用其他工具,WinMerge等合并您更改的任何内容。

之后,你可以做任何你想做的事情,但要做得正确:)。

答案 2 :(得分:3)

您是刚开始使用OS命令复制/移动目录,还是从SVN开始?如果您只是通过操作系统复制文件,您仍然会有包含指向旧位置的SVN信息的隐藏文件夹。

答案 3 :(得分:1)

我建议删除(在rm或类似的subversionso之外),测试上面的目录,然后在那里运行svn update。

也就是说,如果您不想像其他人所建议的那样获得全新的工作副本,这可能是最安全的方法。

答案 4 :(得分:1)

我刚遇到同样的问题。我通过从受影响的文件夹中删除.svn文件夹来修复它。

答案 5 :(得分:0)

我的经验是,有时本地副本与存储库不同步。我通常通过上升本地目录树来解决这个问题,从有问题的目录开始,并尝试进行清理并更新每一步。

答案 6 :(得分:0)

发生了什么事情,你签了一个文件夹,然后本地'svn添加'和/或修改了这个/在这个文件夹中,但在你提交你的更改之前,原始文件夹被移动(或删除)来自SVN存储库。

您需要做的就是将当前结帐切换到SVN存储库中的新位置。所以,假设你有一个从path /到/ folder1 / foo的foo文件夹的签出,并且foo被移动到path / to / foo,你只需要运行:

$ svn switch path/to/foo

就是这样......; - )