2008-09-05 119 views
20

我以某种方式设法将SVN存储库置于不良状态。我移动了一个目录,现在我无法将其提交到新位置。SVN存储库中的“Phantom”目录

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)如何实际上修复的问题。

回答

14

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

为了避免这种情况在未来,这些步骤之间的承诺。如果您想隐藏介入的提交,那么我建议您在分支上执行多步重构,然后将更改合并到您之后单一提交的主线中。

如果它没有太多的工作,那么我建议你又回到了一个干净的工作拷贝和重做你的变化,每一步后提交。如果你感到快乐就失去了历史,即允许新IntegerType.java不都被链接到老IntegerType.java,那么你可以采取通过BCS建议的方法:

  • 将您更改的文件到一些临时位置,剔除任何.svn目录
  • 更新你的工作拷贝到一个干净的工作状态
  • 复制的更改保存到你想去的地方他们是
  • 提交所产生的工作副本
3

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

+2

谢谢。这个答案让我意识到我做了什么(尽管我使用Eclipse来移动目录,你会认为Eclipse会正确地做到这一点,清理起来很麻烦,但是你让我朝着正确的方向前进。生活 – Marvo 2011-06-08 06:09:56

9

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

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

0

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

1

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

也就是说,如果你不希望得到一个全新的工作副本作为其他人所说,这可能是最安全的方法。

0

发生了什么事是你犯了一个文件夹的结帐,然后在本地使用“svn add'ed和/或修改的东西/此文件夹中,但你犯更改之前,原来的文件夹中移动(或者删除)来自SVN存储库。

所有你需要做的是您当前的结账切换到SVN仓库的新位置。所以,假如你从路径foo的文件夹的结账/到/文件夹1 /富,而FOO被转移到路径/到/ foo的,你只需要运行:

$ svn switch path/to/foo 

就是这样... ;-)

+0

这听起来很合理,不幸的是,我现在没有一个工作副本来测试它...... ;-) – 2009-12-12 16:27:38

1

我只是有这个同样的问题。我通过从受影响的文件夹中删除.svn文件夹来修复它。