首页 > 解决方案 > 从工作副本重建本地 SVN 存储库

问题描述

我一直在 Dropbox 中使用本地 SVN 存储库开展一个项目,但它的修订历史似乎已损坏无法修复,现在所有签入都失败了。所以我正在考虑从现有的工作副本创建一个新的存储库。只要我可以保持开发环境中的实际路径相同(在我的 Mac 和 Windows 开发机器上),我可以丢失历史记录。

当然,如果我只是尝试使用svn import导入本地文件... svn 不会将现有路径识别为工作副本,它将迫使我将它们检出,从而更改所有内容的位置。

我已经尝试trunk/Client在新的空存储库中创建一个空文件夹并将其签出到我现有的<main dev folder>/Client目录中,以便我可以将所有项目重新添加到其中...但是 SVN 客户端拒绝添加 的内容<main dev folder>/Client,因为它检测到它们已经在旧存储库的版本控制之下。

另外,当然,即使我确实在我的 Mac 开发机器上检查了它们,我也需要拉一个类似的开关来让 Windows 开发机器从新的存储库同步它的工作副本。(我在 Mac 上使用 svnX,在 Windows 上使用 TortoiseSVN——但我使用的是 Mac 客户端,因为该工作副本是最新的。)

有关如何将这些文件放入新存储库而无需重新排列所有内容的任何建议?

(注意:“放弃 svn 并转向 git”实际上是一个相当可接受的答案,但我仍然需要指导;我在这两个方面的经验同样有限!)

标签: svn

解决方案


  1. 必须正确使用svn import,因为此命令“将未版本化的文件或树提交到存储库中”并且您必须在导入之前从 WC 中准备未版本化的树
  2. 每个工作副本都链接到单个存储库,并且此关系存储在 WC 的元数据中,您必须更改它才能使用命令链接旧 WC新 reposvn relocate
  3. 为了成功地将您的 WC 重新定位到新存储库,您必须为新存储库提供与旧存储库中相同的 UUIDsvnadmin setuuid

因此

您漫长的迁移路径

  • 创建 WC 的未版本控制副本
  • 创建新的本地空存储库(我建议准备和使用 svnserve 作为svn://访问类型,而不是file:///从第一步开始)
  • 获取旧仓库的 UUID(svn info | grep UUID在 WC 中)并将其应用于新仓库
  • 将树从未版本控制的副本导入新的 repo(到相同的相对路径,就像在旧的 repo 中一样)
  • 将现有的 WC 迁移到新的存储库
  • 尝试svn up验证结果

但你可以宁愿完全忘记旧的回购并使用

你的捷径

  • 创建 WC 的未版本控制副本
  • 创建新的本地空存储库(我建议准备和使用 svnserve 作为svn://访问类型,而不是file:///从第一步开始)
  • 将树从未版本控制的副本导入新的 repo
  • 导入的测试结果svn ls -R <REPO-ROOT-URL>
  • 删除|归档旧 WC 并将新 WC 从新存储库中检出到旧位置

推荐阅读