需要升级和重新定位Subversion repo - catch 22?

时间:2012-08-01 19:52:31

标签: svn version-control

我今天遇到了一个有趣的Catch 22,试图恢复旧的Subversion仓库和工作副本。

我最初移动并升级了仓库,然后升级工作副本并将其指向新移动的仓库。

$ svn upgrade
svn: E180001: Unable to connect to a repository at URL 'file:///OLD/REPO/PATH'
svn: E180001: Unable to open an ra_local session to URL
svn: E180001: Unable to open repository 'file:///OLD/REPO/PATH'

因此,升级失败,因为repo指向错误的位置。没问题,我会在新的回购路径上重新命名工作副本:

$ svn switch --relocate file:///OLD/REPO/PATH file:///NEW/REPO/PATH .
svn: E155036: Please see the 'svn upgrade' command
svn: E155036: Working copy '/WORKING/COPY/PATH' is too old (format 10, created by Subversion 1.6)

这是一个完美的Catch 22 - 无法升级,因为repo路径错误,因为你没有升级而无法修复repo路径。

3 个答案:

答案 0 :(得分:3)

我的工作副本建议我应该进行“svn升级”。执行此操作后,我无法使用URL“file:/// ...”连接到我的本地存储库。所有替代方案都不起作用,除了我在以下几行中注释的那个。

我通过以下步骤解决了这个问题:

  1. 从同一个存储库“file:/// ...”创建新的工作副本:“svn checkout file:/// ... new-wc”。
  2. 应用我原来工作副本的当前更改(使用“rsync -a old-wc / new-wc /").
  3. 提交对存储库的新更改。
  4. 删除所有工作副本(“rm -rf old-wc”)。
  5. 取代“工作”;-)工作副本:“mv new-wc old-wc”。
  6. 这对我有用。希望这有帮助!

答案 1 :(得分:1)

我发布了我想出的答案,以防有人帮忙。但这并不理想,所以我很想知道别人是否有更好的解决方案。

我抓住工作副本中的文件,看看/ OLD / REPO / PATH的提到位置;唯一的地方是每个文件夹中的“.svn / entries”文件。

所以,我想通过运行一个快速的bash脚本替换每个条目文件中的路径来创建自己的“svn switch --relocate”:

#!/bin/bash
for f in `sudo find . -name "entries"`
do
   sudo perl -pi -e 's/OLD\/REPO\/PATH/NEW\/REPO\/PATH/g' "$f"
done

任何人都知道更简单的方法,或者手动更改“条目”文件中的repo路径有什么不利之处?

答案 2 :(得分:1)

一种解决方案是降级subversion客户端,或者将旧二进制文件安装在不同的目录中,并暂时将该位置预先添加到您的路径中。这将允许您首先重新定位存储库,然后您可以切换到新客户端并升级它。