我设法让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)如何实际修复问题。
答案 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
就是这样......; - )