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

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

我想将“ docs”文件夹(以及所有的修改)移动到“ project _ docs”存储库。有办法做到这一点吗?

91439 次浏览

我不相信你可以远程操作(即,没有本地副本)。但这应该工作: 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作为 Samuel 描述道

SVN 文档中讨论了这一点。查看 svndumpfilter上的 仓库维护部分... ... 它特别描述了如何从中央存储库中转储项目,并将它们移动到新的、独立的存储库中。

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

如果不能访问存储库,就无法维护修订历史,只能将文件复制到新的存储库并提交。

Svndump 过滤器有一个严重的缺陷——如果一个文件或路径被从你正在筛选的路径复制到你正在筛选的路径,svndump 过滤器将无法填写历史记录,这个作业将会失败。

如果遇到这个问题,可以使用 Svndump 过滤器2

以供日后参考:

SVN 的文件明确报告:

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

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

因此,在执行此操作时,不要使用只包含路径名称的 sed 进行字符串替换。

将“ Node-path: old _ path”替换为“ Node-path: new _ path”。

我尝试使用公认的答案,但我有一个巨大的存储库,我想导出一个小目录,我不能负担转储整个存储库。

因此,我只导出我的目录改变的地方的修订(如果您想导出的目录引用了您的回购中的其他地方,这可能不起作用)。

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)

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

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

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