我有一个现有的 SVN 存储库,其中包含一个包含我的项目的文件夹。我想知道是否有一种方法可以创建一个新的存储库,并将我的项目文件夹设置为其根目录并保留所有颠覆历史记录(日志)。请注意,我不介意丢失原始存储库修订号。
谢谢。
我有一个现有的 SVN 存储库,其中包含一个包含我的项目的文件夹。我想知道是否有一种方法可以创建一个新的存储库,并将我的项目文件夹设置为其根目录并保留所有颠覆历史记录(日志)。请注意,我不介意丢失原始存储库修订号。
谢谢。
您可以手动复制存储库,也可以使用 svnadmin。
然后,您可以将项目的子目录移动到根目录下,并删除其他所有内容,从而保留您想要的目录结构。每个文件都将保留历史记录,但它会记住文件曾经有不同的路径(这可能是一件好事)。
Avi 的解决方案可能是最简单的,但缺点是新存储库将包含该项目之外的所有内容的完整历史记录。在下面的示例中,我假设您在 *NIX 机器的命令行中,并且您在包含现有存储库的目录中。
svnadmin create new-project-repo # create new repo next to old repo
svnadmin dump old-project-repo | svnadmin load new-project-repo
svn mv file://$PWD/new-project-repo/my-project/trunk file://$PWD/new-project-repo/trunk
svn mv file://$PWD/new-project-repo/my-project/branches file://$PWD/new-project-repo/branches
svn mv file://$PWD/new-project-repo/my-project/tags file://$PWD/new-project-repo/tags
# ... svn rm file://$PWD/new-project-repo/XXX for all the cruft still at the top level.
如果你运行的是 subversion 1.6.x,svnsync 提供了一个更好的选择。在 1.6.x 之前,svnsync 只能用于复制整个存储库。在 1.6.x 中,它获得了仅复制存储库的给定子树的能力。
svnadmin create new-project-repo
# svnsync needs the ability to set revision properties, so we must install a pre-revprop-change
# hook script which just exits with status 0 (no error). On *NIX systems, the program `true` will do this.
ln -s /usr/bin/true new-project-repo/hooks/pre-revprop-change # possibly /bin/true
svnsync init file://$PWD/new-project-repo file://$PWD/old-project-repo/my-project
svnsync sync file://$PWD/new-project-repo
# go drink some coffee
仅供参考: svnsync 选项适用于 subversion 1.5.3。
此外,这是一个执行相同操作的 Windows 批处理脚本:
SET OLD_REPO_URL= https://old-project-repo/my-project
SET NEW_REPO_URL=D:/Repositories/new-project-repo
SET NEW_REPO_FILE_PATH=D:\Repositories\new-project-repo
svnadmin create %NEW_REPO_FILE_PATH%
echo exit 0 > %NEW_REPO_FILE_PATH%\hooks\pre-revprop-change.bat
svnsync 初始化文件:///%NEW_REPO_URL% %OLD_REPO_URL%
svnsync 文件:///%NEW_REPO_URL%
注意:在同步完成之前,您将无法浏览新存储库。