【发布时间】:2011-05-02 04:01:47
【问题描述】:
我已将一个项目从 CVS 迁移到 SVN。现在我需要重命名该项目。什么是重命名它的最佳方法,保持所有历史不变。项目文件夹包含大约 100 个 C 及其头文件。
【问题讨论】:
-
如果您使用VisualSVN Server,您只需在VisualSVN 服务器管理器MMC 中右键单击一个存储库并选择“重命名”
我已将一个项目从 CVS 迁移到 SVN。现在我需要重命名该项目。什么是重命名它的最佳方法,保持所有历史不变。项目文件夹包含大约 100 个 C 及其头文件。
【问题讨论】:
原始答案(已被接受)在提出问题时与原始问题(此后也已被编辑)相关。
情况发生了变化,正如其他人在此线程中指出的那样,现在有更好的方法来重命名存储库和/或存储库中的项目。
我将把这个答案转换为社区 wiki,并让其他人继续维护它以确保它保持相关性。
【讨论】:
cp -r old_repo_directory/conf new_repo_directory复制您的身份验证设置
要重命名存储库,您只需重命名其根目录并生成新的 UUID。假设存储库位于 /var/svnroot/my_repo 中,您必须运行此命令(以 root 身份)重命名存储库:
$ mv /var/svnroot/my_repo /var/svnroot/my_new_repo
$ svnadmin setuuid /var/svnroot/my_new_repo
之后,您可以通过自己喜欢的协议访问它。
【讨论】:
SVN Book\5. 仓库管理\Moving and Removing Repositories:
Subversion 存储库数据完全包含在存储库中 目录。因此,您可以将 Subversion 存储库移动到其他存储库 磁盘上的位置、重命名存储库、复制存储库或删除 完全使用您的操作提供的工具存储库 目录操作系统
重命名通常在同一台服务器上完成,因此只需简单地重命名/移动存储库目录即可。 不需要调用svnadmin setuuid,因为您没有制作副本并且 UUID 应该保持不变,因此您的客户端可以轻松地重新定位到新的存储库 URL。
【讨论】:
有时管理员可能会更改存储库的“基本位置”——换句话说,存储库的内容不会更改,但用于访问存储库根目录的主 URL 会更改。例如,主机名、URL 方案或指向存储库本身的 URL 的任何部分可能会更改。您可以使用 svn switch 命令“重写”工作副本中所有 URL 的开头,而不是签出新的工作副本。使用 --relocate 选项进行替换。不更改文件内容,也不联系存储库。这类似于在运行 s/OldRoot/NewRoot/ 的工作副本 .svn/ 目录上运行 Perl 脚本。
$ svn checkout file:///tmp/repos test
A test/a
A test/b
…
$ mv repos newlocation
$ cd test/
$ svn update
svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///tmp/repos'
$ svn switch --relocate file:///tmp/repos file:///tmp/newlocation .
$ svn update
At revision 3.
svn relocate — 重新定位工作副本以指向不同的存储库根 URL。
概要
svn relocate FROM-PREFIX TO-PREFIX [PATH...]
svn relocate TO-URL [PATH]
说明
有时管理员可能会更改存储库的位置(或从客户的角度来看的明显位置)。存储库的内容不会更改,但存储库的根 URL 会更改。主机名可能会更改,因为现在正在从另一台计算机提供存储库。或者,URL 方案可能会发生变化,因为现在通过 SSL(使用 https://)而不是通过普通 HTTP 提供存储库。这些类型的存储库重定位有许多不同的原因。但理想情况下,存储库的“地址更改”不应突然导致指向该存储库的所有工作副本永远无法使用。幸运的是,事实并非如此。 Subversion 提供了 svn relocate 命令,该命令“重写”工作副本的管理元数据以引用新的存储库位置,而不是强制用户在重新定位存储库时签出新的工作副本。
第一个 svn relocate 语法允许您更新一个或多个工作副本,基本上相当于在这些工作副本中记录的存储库根 URL 内进行查找和替换。 Subversion 将在这些 URL 中将初始子字符串 FROM-PREFIX 替换为字符串 TO-PREFIX。这些初始 URL 子字符串可以长或短,以区分它们。显然,要使用这种语法形式,您需要知道工作副本指向的存储库的当前根 URL 以及该存储库的新 URL。 (可以使用 svn info 来判断前者。)
第二种语法根本不需要您知道与工作副本关联的当前存储库根 URL — 只需知道它应该指向的新存储库 URL (TO-URL)。在这种语法形式中,一次只能重定位一个工作副本。
示例
让我们从反映本地存储库 URL 的工作副本开始:
$ svn info | grep URL:
URL: file:///var/svn/repos/trunk
$
有一天管理员决定重命名磁盘存储库目录。我们错过了备忘录,所以下次我们尝试更新工作副本时会看到一个错误。
$ svn up
Updating '.':
svn: E180001: Unable to connect to a repository at URL 'file:///var/svn/repos/trunk'
在自动售货机将管理员逼入绝境后,我们了解到存储库正在移动,并被告知新的 URL。不过,我们不需要签出新的工作副本,而是要求 Subversion 重写工作副本元数据以指向新的存储库位置。
$ svn relocate file:///var/svn/new-repos/trunk
$
Subversion 并没有告诉我们太多关于它做了什么,但是嘿——我们真正需要的是无错误操作,对吧?我们的工作副本可再次用于在线操作。
$ svn up
Updating '.':
A lib/new.c
M src/code.h
M src/headers.h
…
默认情况下,svn relocate 将遍历嵌套在您的工作副本中的任何外部工作副本,并尝试重新定位这些工作副本。使用--ignore-externals 选项禁用此行为。
【讨论】:
首先了解\Repositories文件夹所在的位置,(默认C:\Repositories)
之后,在 /Repositories 文件夹中重命名您想要的存储库。 (窗口)
如果您使用的是 Eclipse,则丢弃 SVN 存储库中的旧存储库位置并转到 New->Repository Location...-> your new repository name。就是这样。
【讨论】: