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


156

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

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

Answers:


183

如果您有权访问存储库本身(而不是工作副本),则应该能够转储当前存储库,对其进行过滤以仅包含有关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
很好的例子。请注意,正如我链接的文档中所述,此解决方案将对所有修订版进行重新编号,以便没有“空白”。如果您在其他任何地方引用文档修订,请记住一些注意事项。
亚当·贝莱尔

1
我建议删除空修订,以避免向目标存储库添加一堆空修订,这很可能使任何不了解负载的人感到困惑。因为--preserve-revprops将保留提交消息,而不是使用默认的加载消息。
塞缪尔

11
感谢你的回答。如果有人需要知道,如果您需要更多,那么只需在包含列表中在它们之间放置一个空格即可。例如 ... include folderOne folderTwo
Robin Robinson

6
对修订版本重新编号可能不是一个好主意,因为提交消息和问题跟踪工具可能会引用它们
Wim Coenen 2009年

5
这对我有用。我是Windows用户(Visual SVN Server),如果有帮助,我的第一个命令将如下所示:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

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

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


4
这是svndumpfilter2的更好链接: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin 2011年

在这种情况下,您可以将所需的路径添加到列表中...尽可能具体...然后在导入后从项目中删除这些条目。
James Gawron

6

SVN文档中对此进行了讨论。请查看... 上的“ 存储库维护”部分,svndumpfilter它专门描述了如何从中央存储库中转储项目并将其移动到新的单独的存储库中。


2

我不相信您可以远程执行此操作(即没有本地副本)。但这应该可行:svn export将原始服务器中的文件夹,然后将svn add其移至新的存储库。

喜欢:

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

编辑:天哪,这删除了历史。svnadminSamuel描述的那样使用。


3
但是,如果不访问存储库本身,则无法保留修订。如果您只能拥有工作副本,这是他所能做的最好的事情。
塞缪尔

2

备查:

SVN文档明确报告:

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

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

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

用“节点路径:new_path”替换“节点路径:old_path”。有关更多详细信息,请参见SVN书第5章“存储库管理”。


1

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

因此,我仅导出目录更改的修订版(如果要导出的目录具有对存储库中其他位置的引用,则可能无法使用)。

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_to_docs),服务器中的位置(/svn/old_repo)和存储库中文档的路径(path/to/docs

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.