2

今天我遇到了一个有趣的 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 指向了错误的位置。没问题,我会将工作副本重新指向新的 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)

这是一个完美的第 22 条军规——因为 repo 路径错误而无法升级,因为您尚未升级,所以无法修复 repo 路径。

4

3 回答 3

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”。

这对我有用。希望这可以帮助!

于 2012-12-08T13:44:12.930 回答
1

我正在发布我想出的答案,以防它帮助某人。虽然这并不理想,所以我很想看看其他人是否有更好的解决方案。

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

所以,我想我会制作自己的“svn switch --relocate”,只需运行一个快速的 bash 脚本来替换每个条目文件中的路径:

#!/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 路径有什么缺点吗?

于 2012-08-01T19:52:31.207 回答
1

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

于 2012-08-01T20:56:10.070 回答