我有一个“docs”名为“project”的Subversion存储库中的文件夹。我得出结论,它应该保存在一个名为“project_docs”的单独的Subversion存储库中。

我想移动“docs”。文件夹(及其所有修订)到“project_docs”库。有没有办法做到这一点?

有帮助吗?

解决方案

如果您有权访问存储库本身(而不是工作副本),您应该能够转储当前存储库,将其过滤为仅包含有关docs文件夹的信息,并将其加载到其他存储库中。

会是这样的:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

无法访问存储库,您无法维护修订历史记录,您必须解决将文件复制到新存储库并提交的问题。

其他提示

svndumpfilter有一个严重的缺陷 - 如果文件或路径从您过滤的路径复制到您要过滤的路径,svndumpfilter将无法填写历史记录,作业将失败。 / p>

如果遇到此问题,可以使用 svndumpfilter2

这在SVN文档中讨论。查看 svndumpfilter 存储库维护部分> ...它具体描述了如何将项目从中央存储库转储出来并将它们移动到新的独立存储库中。

我不相信你可以远程进行(即没有本地副本)。但是这应该有效: svn export 来自原始服务器的文件夹,然后 svn add 将它添加到新的repo中。

像:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

编辑:噢,这会让历史失败。使用 svnadmin 作为 Samuel描述

供将来参考:

SVN文档明确报道:

如果您计划手动编辑转储文件以删除顶级目录,请确保您的编辑器未设置为自动将行尾字符转换为本机格式(例如,\ r \ n到\ n),因为内容将不符合元数据。这将使转储文件无效。

使用sed或Vim替换顶级目录,但此目录名也包含在项目文件中 !!!! 这会导致SVN加载校验和错误。

因此,当您执行此操作时,不要使用仅具有路径名的sed进行字符串替换。

替换&#8220;节点路径:old_path&#8221;使用&#8220;节点路径:new_path&#8221;。参见SVN第5章&#8220;存储库管理&#8221;了解更多详情。

我尝试使用接受的答案,但我有一个庞大的存储库,我想导出一个小目录,我无法负担转储整个存储库。

所以,我只导出了我的目录更改的修订版(如果您要导出的目录引用了您的仓库中的其他位置,则可能无效。)

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

您必须替换您的repo URL( URL_to_docs ),服务器中的位置( / svn / old_repo )和存储库中文档的路径( path / to /文档

如果要更改新存储库中doc目录的位置,可以轻松编辑 docs_only.dump

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top