如何创建远程 SVN 仓库的本地副本?

13

我有一个远程svn仓库。我想将其检出(包括历史记录),然后在Visual Studio中使用它作为常规仓库。一段时间后,我将从本地仓库提交更改到远程仓库(并更新任何文件)。

所以看来我只需要两个svn仓库的副本,并且我需要同步它们的能力。

如何做到这一点?

5个回答

22

这与SVN的本意是相悖的。看起来您需要使用像Git或Mercurial之类的分布式版本控制系统,这就是为什么许多开发者已经转向了这样的系统。

我建议使用git,并使用git-svn桥接工具来能够与您的SVN服务器通信。

当您从SVN克隆时,Git会保留整个存储库的副本(这意味着初始克隆可能需要很长时间,因为它需要检出每个修订版本)。然后,您可以在本地Git存储库中进行提交,并将其推送回SVN存储库。

我不知道是否有任何干净的方法仅使用SVN来完成此操作。 一个典型的工作流程可能是:

git svn clone http://yoursvnserver/svn --username vcsjones

#make some changes
git add -A
#stage your changes. add -A stages all changes;
#you can stage individial files too or use git add -i for interactive adding
git commit -m "My commit messages"

#repeat makes changes and commit as many times as you want
git svn dcommit
#commit all local commits back to the SVN repository.
如果您是一个人独立开发,请将代码仓库存储在USB闪存驱动器上(确保备份以防意外丢失或损坏)。

1
我不想使用Git。嗯,我只想在另一个地方拥有存储库的SVN副本,并且我需要能够同步它们...这真的很复杂吗? - Oleg Vazhnev
1
@javapowered 对于 SVN;是的,这一点都不直接。你预计有多少人会在这上面工作? - vcsjones
1
我是这个代码库的唯一用户 :) - Oleg Vazhnev
@javapowered,您可能会发现这篇文章很有趣:http://subversionee.blogspot.com/2007/04/keeping-multiple-subversion.html - vcsjones
@vcsjones 关于pullpush的示例怎么样? - AbdelHady

7
如其他回答所述,您无法使用双向同步拥有两个SVN存储库。对于SVN-SVN配对,您只能构建单向同步 RO SVN-mirror

对于可以与中央交换的本地存储库,必须使用DVCS。没有办法使用直接的SVN来实现,不使用辅助的DVCS。如果不想使用Git,则可以使用带有hgsubversion、Bazaar等的Mercurial,但无论如何都是额外的SCM。

对于独立工作(如果您真的必须这样工作),最好在服务器上分支。只需不要忘记定期将主干合并到您的分支中;这将帮助您避免“合并头痛”。


分支在服务器上不是一个选项,因为我想关闭服务器(这就是为什么我想要本地存储库,在完全离线的情况下工作一段时间)。 - Oleg Vazhnev
转储存储库,加载新的。当您将其重新上线时,请重复操作以获取存储库。 - Lazy Badger

5
如vsjones所提到的,您可以使用git-svn来检出一个Subversion存储库,将其用作本地Git存储库,然后再上传回去。您甚至可以使用Microsoft Git源代码控制提供程序,使您能够将Git与VisualStudio集成在一起。 然而,我想问一下为什么您要这样做呢?似乎您可能会在CM术语中被称为“爬进洞里”。
“爬进洞里”意味着,与其与其他人合作,你会私下工作而没有任何监督。您希望让您的代码变得绝对完美。您想要一部计算机代码的杰作。然后,您将向世界展示它,而世界将因您的编码技巧而感到惊叹。您将被誉为天才,甚至可能有机会与女孩交谈。
当然,问题是,在公开场合下编写代码总是最好的。代码审查不仅适用于已完成的代码,也适用于正在编写的代码。在你走太远的盲道之前。
另一个问题是开发人员倾向于一口咬下比他们能消化的更多内容。如果我需要在与其他人相同的主干上检查我的工作,那么我更有可能少量提交代码。 (是的,我可以用“字节”来开个玩笑,但我想保持严肃)。我会做出一些更改,也许添加一些方法,测试并提交。然后,继续进行更改,测试和提交。
我曾经是ClearCase管理员。在ClearCase中,每个开发人员都有自己的开发流。您在您的流上编写代码,然后将您的工作合并到集成流中。 (基本上,每个人都有自己的分支,并将其更改合并到主干)。作为我的工作的一部分,我会催促开发人员提交他们的更改。我运行报告查看开发人员交付代码的最后时间。我不断处理合并问题。我觉得自己像是一名警察。
然后,我有一份工作,每个人都使用CVS。在CVS中,分支很麻烦,因此每个人都在同一个分支上工作。我无法想象这会怎样工作。三十六名开发人员如何在同一个分支上工作?然而,随着时间的推移,我开始意识到,每个人都可以在同一个分支上工作,而且问题更少。我不再是巡逻警察,而且除了确保所有开发人员遵守规则之外,我还可以做其他CM功能,以前我从未有时间做过。我的与开发人员的关系发生了变化。我不再是每个人都说要做什么的人,而是一个可以提供帮助的人。

因此,在您自己的私有存储库中完成工作并交付成品给团队时,要小心。如果您正在进行需要长期开发且可能在进行过程中“破坏构建”的重大工作,请在Subversion中请求您自己的功能分支。这样,每个人都可以看到您在做什么。

这并不是说没有使用git svn的正当理由。我个人喜欢每隔几分钟检查一次我的代码。这使我能够恢复一个文件,就像在我开始弄乱之前五或十分钟那样。我仍然采取小步骤,并在完成后检查我的代码。我每天平均向我们的主存储库提交约3到4个版本。我也使用svn git,但不是为了钻进我的洞穴,而是为了拥有一个可以用来将我从混乱的编码情况中拉出来的救生绳。

因此,请查看git svn,但请不要使用您有自己存储库的借口来躲避团队的其余成员。您可以使用MS Git Provider(或来自AnkhSVN的[SVN提供程序])。


虽然这个回答与主题无关,所以这个评论也是如此,但我只想说:+1 - gnomie

0

将 SVN 存储库克隆到不同的 SVN 站点

有一种方法可以将 SVN 存储库与全部或部分历史记录克隆到不同的 SVN 站点。只需在 bash 中运行以下命令即可轻松完成。

clone-svn2svn.sh <source_svn_url> <destination_svn_url>

我花了相当长的时间来实现这个目标,并编写了一个脚本,使其自动化并为其他人记录下来。该脚本在幕后使用git,但它将git从用户中抽象出来(除非出现问题)。

GitHub链接: clone-svn2svn

更新SVN仓库

在克隆源代码之后,还有关于如何从源代码更新仓库的说明。您可以在GitHub页面上找到它们。不幸的是,我没有为此编写脚本,您需要亲自使用git命令行。但这也可以自动化。


0
你可以通过以下方式创建最新版本的本地副本:
svn checkout svn://host/repos/test folder

如果您需要完整的历史记录,需要使用诸如svnsyncgit svn(后者在上文中已经描述过)等工具克隆完整的服务器存储库。
如果您使用svnsync创建存储库副本,请不要困惑于克隆的存储库不包含您提交的文件。这是因为SVN服务器将文件保存在db/revs/文件夹中的FSFS格式中。您可以通过通常的svn checkout file:///path-to/SVNRepository/ folder方式检索文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接