如何克隆SVN存储库的一部分?

我有一个SVN存储库,里面有很多目录。现在我想克隆这个存储库,只留下一个特定的目录。当然,我不需要在这个新存储库中与其他目录相关的任何修订。我该怎么做?谢谢。     
已邀请:
您将需要创建存储库的转储,并过滤掉所需的目录和修订。
svndumpfilter
是用于此目的的通用工具。有关示例,请参阅subversion书的本章。     
另一种可能性是git svn clone,它只提取感兴趣的目录。然后可以将其推送到新的svn仓库。这简单吗?不,但如果您无法访问服务器,则非常方便。我确信有更好的方法 - 但这样可以确保您不会意外地推送到原始的svn回购。     #original svn path     git svn clone http:// server / path / to / clone orig     #SVN只放你的分支     svnadmin创建新的     #添加一个条目,或git svn错误...     svn co file:/// path / to / new new.wd     mkdir new.wd / null     svn添加new.wd / null     svn ci -m“add null”new.wd / null     #克隆我们的克隆     git clone file:/// path / to / orig abc     cd abc     #设置svn repo的svn路径     git svn init file:/// path / to / new     #draw数据(我们的一次提交)     git svn fetch     #显示分支     git branch -a     #为推送准备git repot     git rebase --onto remotes / git-svn --root master     #final终于推向新的svn repo。     git svn dcommit 我在哪里可以找到如何做到这一点,所以我想出了这个。您可能需要像这样混乱使用svn donf文件:     svn_repo = “$(PWD)/新”     用户= “名为myUsername”     echo'[/]'>> $ svn_repo / conf / authz     echo“$ user = rw”>> $ svn_repo / conf / authz     echo'[users]'>> $ svn_repo / conf / passwd     echo“$ user = test”>> $ svn_repo / conf / passwd     echo'password-db = passwd'>> $ svn_repo / conf / svnserve.conf     echo“svn repo is file:// $ svn_repo”     svn co file:// $ svn_repo svn.wd 在上面的示例中,myusername的密码为test。     
执行您尝试执行的操作的传统方法是将存储库转储到转储文件,使用svndumpfilter根据您的需要包含或排除文件,然后将筛选的转储文件加载到新的存储库中。这种方法适用于简单的更改,例如从存储库中删除几个文件。 当存储库包含文件移动和副本时,事情变得更加困难。 让我们看一个最简单的例子,它有一个名为
MyProject
的项目文件夹,它已经在历史的某个时间重命名为
TheProject
。另一个名为
TheProject/copiedfile.txt
的文件随后从位置
AnotherLocation
下复制到
TheProject
。一个基本的树结构可能看起来像这样。
...
+ AnotherLocation
|--- copiedfile.txt
|--- unwantedfile.txt
+ TheProject
|--- copiedfile.txt
|--- otherfile.txt 
...
您希望
TheProject
拥有自己的新存储库。因此,您将存储库转储到文件并使用svndumpfilter仅包含
TheProject
,因为这是您在HEAD修订版中看到的项目的名称。
svndumpfilter include /TheProject < input.dump > output.dump
不幸的是,你从svndumpfilter得到了这个错误
svndumpfilter: E200003: Invalid copy source path '/MyProject'
那是因为
TheProject
曾经被称为
MyProject
,并且在过去的一些修订中它被重命名。由于重命名本质上是一个删除和复制,因此svndumpfilter无法找到创建
TheProject
的副本的来源并且正确地出现错误。所以我们再次尝试使用包含
MyProject
的以下命令
svndumpfilter include /TheProject /MyProject < input.dump > output.dump
Svndumfilter现在出现了另一个错误。
svndumpfilter: E200003: Invalid copy source path '/AnotherLocation/copiedfile.txt'
是的,这是因为
copiedfile.txt
AnotherLocation
复制到
TheProject
。因此我们必须包含此文件,否则我们无法将其复制到“TheProject”。让我们再试一次。
svndumpfilter include /TheProject /MyProject /AnotherLocation/copiedfile.txt < input.dump > output.dump
操作成功!第三次幸运似乎! 让我们尝试将过滤后的转储文件加载到存储库。
svnadmin create newrepo
svnadmin load newrepo < output.dump
毕竟没那么幸运!加载过程中出现以下错误
* editing path : AnotherLocation/copiedfile.txt ...svnadmin: E160013: File not found: transaction '1-1', path '/AnotherLocation/copiedfile.txt'
啊!这是因为我们忘了包含
AnotherLocation
,因为它是
copiedfile.txt
的父文件夹
svndumpfilter include /TheProject /MyProject /AnotherLocation < input.dump > output.dump
好的,这个命令有效,加载也有效。不幸的是,我们现在也包括了
/AnotherLocation/unwantedfile.txt
。结论是使用
svndumpfilter include
并不真正起作用,因为它没有给我们提供我们所追求的粒度。我们必须使用
svndumpfilter exclude
做所有事情,试图排除我们不需要的所有东西,从而最终得到一个包含我们需要的文件的存储库。可以说,它充满了自己的一系列问题。例如,排除存储库中实际需要的文件非常容易。如果人们想要一个这样的例子,我可以扩展这个答案。 肯定有更好的办法。事实证明,这是一个商业产品。我们开发了一个名为Subdivision的工具,专门从subversion存储库中提取文件和文件夹。它还可以从subversion存储库中删除(或删除)文件,以及将存储库拆分为两部分,同时保证不会从两个存储库之一中遗漏任何文件。 Subdivision的亮点在于它拥有整个存储库的内存视图,并运行解决上述示例中遇到的所有问题所需的算法。这意味着您只需在保存用户时间的同时获取正确文件的必要粒度,因为操作在一次传递中完成。     

要回复问题请先登录注册