如何将单个文件夹从一个Subversion存储库移动到另一个存储库?

时间:2009-01-06 19:05:46

标签: svn repository directory move

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

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

7 个答案:

答案 0 :(得分:182)

如果您已访问存储库本身(而不是工作副本),则应该能够转储当前存储库,将其过滤为仅包含有关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

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

答案 1 :(得分:30)

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

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

像:

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

编辑:噢,这会让历史失败。将svnadmin用作Samuel describes

答案 4 :(得分:2)

供将来参考:

SVN文档明确报道:

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

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

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

用“Node-path:new_path”替换“Node-path:old_path”。有关详细信息,请参阅SVN第5章“存储库管理”。

答案 5 :(得分:1)

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

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

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/docs

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

答案 6 :(得分:0)

使用任何svndumpfilter工具都无法成功实现类似目标。

然后我发现了svndumpsanitize。它实际上不是尝试简单地分析转储文件中的修订,而是尝试连接提到包含文件的所有修订,或者理智而安全地跳过包含已排除文件的修订。它可能是您不一定(或不需要)的工具,但值得一试。