我可以在两个SVN存储库中有一个项目吗?

时间:2009-01-08 21:13:25

标签: git svn

我们的I.T. dept不允许从物理局外部连接到SVN服务器。 (他们就像那样。)当我不在办公室时,我需要处理项目。

我可以查看项目并等到我进入办理登机手续。也许这是最好的。但我喜欢经常入住。我想知道是否有某种方法可以将项目保存在两个存储库中并使它们保持最新状态。这样我总能在某处检查以防我的HD死机。我在VPS服务器上拥有自己的存储库,用于个人项目。

我调查了svn switch命令。我在repos中的当前项目中尝试将我的工作副本从个人转换为工作SVN服务器......

$ svn switch --relocate svn+ssh://personalvps.com/svn/project/trunk svn://worksvn/project/trunk
svn: The repository at 'svn://worksvn/project/trunk' has uuid '2baef97e-42ce-488c-bbba-c2625158c643', but the WC has 'f13e1f32-dc92-4c4a-b84d-34a59fe32063'

然后我尝试添加--username--password参数,但收到错误消息“找不到条目。”

这是可能的还是完全不切实际的?


更新

感谢您的回答。不幸的是,任何涉及I.T.行动的解决方案。 (略有政策变化,在某处更改设置,安装某些东西)不在桌面上。我必须在当前设置中找到一个解决方案,除了我们的Web服务器之外没有来自外部的连接。

我将看看分布式版本控制。

12 个答案:

答案 0 :(得分:11)

您可以将SVN与笔记本电脑上的其他(本地)存储库一起使用。寻找流行的git或SVK。这些允许您首先提交到本地存储库,然后将所有提交同步到主SVN存储库。

答案 1 :(得分:7)

您是否了解过git?它使用本地存储库进行离线工作,并且可以轻松地与svn repo同步。

Two articles解释如何做你想做的事。

答案 2 :(得分:5)

查看svnsync。我使用它将源伪造的SVN存储库镜像到个人盒子,这样我就可以使用Trac了。

http://svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt

它非常易于使用,您应该能够将办公室仓库设置为同步到个人存储库。

答案 3 :(得分:4)

作为最后的努力,您总是可以使用SSH在公司防火墙中挖洞。看看“ssh隧道”(而且,想到它,“在防火墙上戳一个洞”也可能是一个很好的搜索词)。我想你会想要-L或-R ssh选项,但我不记得哪些,或者即使它们确实是正确的。如果您正在运行Windows,如果先安装Cygwin,仍然可以使用相同的技术。

编辑:抱歉,我不清楚这是如何运作的。你想要的选项是-R。它在远程机器上打开一个端口(用于监听)。当某些东西连接到远程计算机上的该端口时,该连接将通过SSH连接返回到本地计算机,然后在本地网络中向您选择的服务器发送。您可以在晚上离开SSH之前从工作计算机连接到家庭计算机以打开隧道。然后,当您在家工作时,将SVN工作副本(使用svn switch --relocate)设置为指向家庭计算机。顺便说一句,如果您正在运行svnserve守护程序,SVN端口默认为3690。

答案 4 :(得分:3)

单独使用Subversion是不切实际的,但它在git这样的分布式版本控制系统中很实用。

看看git,更重要的是git-svn

答案 5 :(得分:2)

我强烈建议您的IT部门建立一个安全的VPN,即使您身处其他互联网连接,也可以将您置于安全的本地网络上。让多个回购项目保持同步是非常困难的。

作为IT部门的一种解决方法,IT部门没有足够的能力做正确的事情,Bazaar看起来是最容易使用,最完整的解决方案。

答案 6 :(得分:2)

简答:不。您无法在存储库之间共享历史记录。

答案很长:这是像Subversion这样的集中式系统的弱点。分布式版本控制解决方案(如git)没有这个问题。每个“工作副本”都是一个存储库,提交可以脱机并在存储库(或中央“官方”存储库)之间进行同步。

您需要的是使用本地存储库在您的计算机上本地工作的一些方法,并在您能够时来回同步更改。碰巧你有几个选择:

  • git包含提供此类功能的git-svn。 git有一个学习曲线,但1.6.x系列改进了这一点。

  • svk似乎不再非常积极地开发,但它确实运行得相当好。它非常像 。它允许您保留官方存储库的本地镜像,对其进行本地分支的提交,并在您能够时将这些更改推送回官方存储库。它并不像git那样真正地分布在同一个意义上,但它可能更适合你的情况,而不是git的概念变化。

答案 7 :(得分:1)

看看Bazaar。它比 git 更令人生畏,并且具有Subversion存储库的有用外观(通过bzr-svn)。

它允许您查看Subversion存储库中的代码,独立开发(使用本地历史记录),并在需要时将代码检入Subversion。

答案 8 :(得分:1)

就像meador所说,当你在家时,你可以设置SSH隧道穿过你办公室的工作站,并获得办公室SVN的访问权限。

可在此处找到在Windows上设置SSH的优秀指南:Cygwin SSH for Windows

我做了一段时间以获得远程桌面访问权限,直到我能够在防火墙上打开端口设置正确的SSH服务器。

您所做的工作来自您的办公室工作站,与您的家庭计算机建立SSH连接,或者选择专用的家庭服务器。该初始连接的参数将提供-R(远程)隧道,该隧道基本上允许远程机器通过指定端口上的线路返回。

例如,如果发出以下命令,则到达服务器上端口1234的所有流量都将转发到客户端上的端口23。见远程隧道。

ssh2 -R 1234 :: username @ sshserver 来自SSH的^^

然后在家用机器上,您执行类似svn:// localhost:1234的操作,这样您就可以访问办公室中的SVN。

*注意:我不建议不先与您的管理员交谈,因为当您绕过他们的安全时他们会变得非常敏感...相信我,我知道。 ; - )

答案 9 :(得分:1)

我发了一篇关于如何最近做类似事情的博客文章。我认为这对您有用,除非您需要从工作地点同步,除非您可以通过ssh进行隧道传输。

http://justinsboringpage.blogspot.com/2008/11/how-to-copy-svn-repository-from.html

Subversion有一个名为SVNSYNC的工具,可以轻松地从一个存储库同步到另一个存储库。移动到不同的基于Web的服务器时,这非常棒。在这个例子中,我正在将我工作的项目从Sourceforge复制到Google Code。完成后,Google代码存储库将成为一个精确的镜像,包括完整的更改历史记录。

您还需要将存储库的修订号设置为零。谷歌代码可以预见,通过在源页面上设置一个按钮来为您完成这一过程。

您需要拥有Google代码的用户名和密码才能执行此操作。对于您正在复制的存储库,您没有。首先使用初始命令为副本设置内容,然后使用sync命令进行实际复制。它一次只进行一次修订,需要一段时间......

svnsync init https://lispbuilder.googlecode.com/svn https://lispbuilder.svn.sourceforge.net/svnroot/lispbuilderProject svnsync --username YOURNAME --password YOURPASSWORD sync https://lispbuilder.googlecode.com/svn https://lispbuilder.svn.sourceforge.net/svnroot/lispbuilder

答案 10 :(得分:1)

在svn中,您绝对可以设置几个存储库,然后使用svn:externals命令将它们绑定在一起。我在家,所以我不记得完整的细节,但它类似于在CVS中使用模块。您创建一个文件夹并将其上的属性设置为一大堆外部(映射到其他存储库中的其他更高的文件夹)。

丑陋的是它创建分支和最终版本很麻烦,因为具有属性的最终文件夹在存储库中没有得到很好的处理,但除了有点尴尬之外它运行得很好。我们在一个存储库中有基本代码,另外两个具有特定于实例的配置。检查正确的标签,您将获得一个完全合并的项目,准备好进行黑客攻击。 (它确实在CVS中工作得更好,但另一个有用的功能在时间上丢失了)。

保罗。

答案 11 :(得分:1)

如上所述,您需要Subversion复制系统,例如Pushmi或SVK。如果您可以通过Web服务器连接,为什么不使用http访问而不是svn设置SVN?如果端口被阻止,您可以使用mod_proxy将公共URL重新连接到内部svn端口。

但是,如果你不得不与IT部门作斗争,那么它已经全部出错了。您需要与他们互动,最好是正式的,以使他们支持您完成工作所需的任何政策。如果你发现自己绕过了他们的系统,那么你要么会遇到麻烦(例如,你的公司可能有完全正当的理由说公司外没有源代码访问权限,并且你做的事情是违纪行为)或者你的经理需要知道IT不适合你。