如何将一个文件夹从一个Subversion版本库移动到另一个版本库?

我在一个名为“project”的Subversion版本库中有一个“docs”文件夹。 我得出的结论是,它应该保存在一个名为“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 

如果不访问存储库,则无法维护修订历史logging,因此必须先解决将文件复制到新存储库并提交的问题。

svndumpfilter有一个严重的缺陷 – 如果一个文件或path从一个path被复制过滤出来,svndumpfilter将无法填写历史logging,作业将失败。

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

这在SVN文档中进行了讨论。 查看svndumpfilter上的“ Repository维护”部分…它具体描述了如何将项目转储出中央存储库并将其移入新的独立存储库。

备查:

SVN文档清楚地报告:

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

使用sed或Vimreplace顶层目录,但是这个目录名也被包含在一个项目文件中 ! 这会导致SVN加载校验和错误。

所以当你执行这个操作时,不要只用path名的sed来进行stringreplace。

用“Node-path:new_path”replace“Node-path:old_path”。 有关更多详细信息,请参阅SVN书第5章“存储库pipe理”。

我不相信你可以远程执行(即没有本地副本)。 但是这应该工作: svn export从原始服务器svn export文件夹,然后svn addsvn add到您的新回购。

喜欢:

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

编辑:哦,这下降了历史。 正如塞缪尔描述的那样使用svnadmin

我试图使用接受的答案,但我有一个巨大的存储库,我想导出一个小目录,我不能转储整个存储库。

所以,我只导出修改我的目录改变(这可能不会工作,如果您要导出的目录有引用到您的回购其他地方)。

 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 

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

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