158

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

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

4

7 回答 7

184

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

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

于 2009-01-06T19:14:49.050 回答
30

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

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

于 2009-04-02T09:00:58.310 回答
6

这在 SVN 文档中进行了讨论。查看关于...的存储库维护部分,svndumpfilter它专门描述了如何将项目从中央存储库中转储出来并将它们移动到新的、单独的存储库中。

于 2009-01-06T19:10:58.917 回答
2

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

像:

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

编辑:D'oh,这会删除历史。svnadmin按照塞缪尔的描述使用。

于 2009-01-06T19:09:40.433 回答
2

备查:

SVN 文档清楚地报告:

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

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

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

将“节点路径:旧路径”替换为“节点路径:新路径”。有关详细信息,请参阅 SVN 书籍第 5 章“存储库管理”。

于 2011-10-05T09:18:51.320 回答
2

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

所以,我只导出了我的目录更改的修订(如果您要导出的目录引用了您的存储库中的其他位置,这可能不起作用)。

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

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

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

于 2015-11-12T13:16:32.773 回答
0

svndumpfilter我在使用任何工具实现类似目标方面都没有取得如此大的成功。

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

于 2020-11-04T01:28:32.180 回答