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

Svn 如何将单个文件夹从一个Subversion存储库移动到另一个存储库?,svn,repository,directory,move,Svn,Repository,Directory,Move,我在Subversion存储库中有一个名为“project”的“docs”文件夹。我得出的结论是,它确实应该保存在一个名为“project_docs”的独立Subversion存储库中 我想将“文档”文件夹(及其所有修订版)移动到“项目文档”存储库中。有什么方法可以做到这一点吗?我不相信你可以远程完成(即,没有本地副本)。但这应该是可行的:svn从原始服务器导出文件夹,然后svn将其添加到新的repo中 比如: 编辑:哦,这会删除历史记录。使用svnadminas.这将在SVN文档中讨论。查看s

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


我想将“文档”文件夹(及其所有修订版)移动到“项目文档”存储库中。有什么方法可以做到这一点吗?

我不相信你可以远程完成(即,没有本地副本)。但这应该是可行的:
svn从原始服务器导出文件夹,然后
svn将其添加到新的repo中

比如:


编辑:哦,这会删除历史记录。使用
svnadmin
as.

这将在SVN文档中讨论。查看
svndumpfilter
。。。它特别描述了如何从中央存储库中转储项目,并将其移动到新的独立存储库中。

如果您可以访问存储库本身(而不是工作副本),则应该能够转储当前存储库,对其进行筛选,使其仅包含有关文档文件夹的信息,然后将其加载到其他存储库中

大概是这样的:

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
svnadmin dump/svn/old_repos>/repository.dump
svndumpfilter包含路径/to/docs--删除空rev--重新编号rev--保留revprops/docs\u only.dump
svnadmin load/svn/new_repos<./docs_only.dump

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

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

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

供将来参考:

SVN文档清楚地报告:

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

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

因此,在执行此操作时,不要仅使用sed替换路径名的字符串


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

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

因此,我只导出了我的目录发生更改的修订版本(如果要导出的目录引用了repo中的其他位置,则这可能不起作用)

svn日志URL|u到| awk'/^r/{gsub(/^r/,“”,$1);打印$1}>revisions.txt
#反向修订的tac(最旧版本优先)
tac revisions.txt |在读取行时;执行svnadmin dump/svn/old_repo-r$line>>。/docs_revisions.dump;完成
#如果在导出的修订版中仅提交目录文档中的文件,则不必进行筛选
svndumpfilter包含路径/to/docs--删除空rev--重新编号rev--保留revprops/docs\u only.dump
svnadmin load/svn/new_repos<./docs_only.dump
您必须替换您的repo URL(
URL\u to\u docs
)、服务器中的位置(
/svn/old\u repo
)和存储库中的文档路径(
path/to/docs


如果您想更改文档目录在新存储库中的位置,您可以轻松地编辑您的
文档。\dump

使用任何
svndumpfilter
工具,我都没有成功实现类似目标


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

但是,如果不访问存储库本身,您就无法保留修订版。如果你只能有一份工作副本,这是他能做的最好的。很好的例子。请注意,正如我链接到的文档中所述,此解决方案将对所有修订重新编号,以便不存在“清空”。如果您在其他地方引用文档修订,请记住一点。我建议删除空修订,以避免向目标存储库添加一堆空修订,这很可能会让不知道加载的人感到困惑。因为--preserve revprops将保留提交消息,而不是使用默认的加载消息。谢谢您的回答。如果有人需要知道,如果您需要多个文件夹,只需在包含列表中的文件夹之间留出一个空格。例如。。。include folderOne FolderTwo重新编号修订版可能是个坏主意,因为提交消息和问题跟踪工具可能会引用它们。这对我来说很有效。我是一名windows用户(Visual SVN Server),我的第一个命令是这样的,如果它对任何人都有帮助的话:
“C:\Program Files(x86)\VisualSVN Server\bin\svnadmin”dump C:\Repositories\MyRepository>C:\Temp\MyReository.dump
这里有一个更好的svndumpfilter2链接:在这种情况下,您可以将所需的路径添加到列表中。。。尽可能具体。。。然后在导入后从项目中删除这些条目。
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
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