我们公司使用 SVN 存储库。我在工作(主要场所)和家里(主要是实验和重构)进行编程。它们是两台不同的机器,位于不同的网络中,几乎从未同时开启(毕竟我要么在工作,要么在家……)
我想尝试一些分布式版本控制系统,解决一些与基于 SVN 的流程和拥有两台机器相关的问题。在 git、Mercurial 和 Bazaar 中,我选择从 Bazaar 开始,因为它声称它是为人类设计的。这是我第一次使用分布式系统,拥有美观易用的用户界面对我来说很重要。
我想要实现的功能是:
- 能够从 SVN 存储库更新并提交。
- 能够在本地提交我完成某项任务的工作步骤。
- 能够在自己的本地分支机构同时执行几项单独的任务。
- 能够在我的工作电脑和家用电脑之间共享这些分支。
我想使用 U 盘作为工作和家用电脑之间的传输工具。公司服务器不行,因为我可能不会在那里安装任何东西。Web 服务存储库也不行,因为我可能不会将源代码上传到 Web(尤其是如果它是公开的,这似乎是免费 Web 服务中的常见情况)。
这种传输应该是基于 Bazaar 的(或者我将以此结尾的其他任何内容),因此它可以或多或少地自动完成,但如果没有更好的解决方案,手动复制和粘贴某些文件夹或生成补丁文件(假设它们可以工作 - 我对 SVN 中的补丁文件有不好的体验)也可以工作。
然而 U 盘只能用来传输数据。我不想在那里编辑或构建。
我尝试按照 Bazaar 指南与 SVN 进行集成。但失败了。我尝试了两种方法
bzr svn-import
和
bzr checkout
提供来自我的存储库的 URL 作为https://...
和svn+https://...
。在某些情况下,它存在一些证书问题,但输出指定了忽略它们的参数,所以我这样做了。有时它要求我登录(在其他情况下,也许它记得......我不知道),我照做了。
所有程序都运行得非常慢(这可能是我们的服务器问题),并且在某些时候由于连接中断而中断(这几乎肯定是我们的服务器问题:它会在一段时间后截断连接)。但由于(与 SVN 相反)重新启动会重新开始,而不是从中断点开始,因此我无法达到所有约 19000 个修订版本(通常在 150 个左右结束)。
我应该如何使用 Bazaar?是否可以以某种方式从本地结帐导入 SVN 存储库(这样我就不会遭受连接截断)?我听说一位曾经与我们共事的同事很快就用 Mercurial 做了类似的事情(导入具有完整历史记录的 SVN 存储库)。所以我现在正在认真考虑尝试 Mercurial,即使只是为了看看它是否可行。
但是,实现上述功能的一般准则是什么?
答案1
我认为 Bazaar 是最明智的 DVCS,尤其适合熟悉 Subversion 的用户。它可以与 Subversion 系统配合使用,非常有效。
看起来bzr svn-import
命令会从 Subversion 导入所有分支,这可能不是您想要的。无法从 Subversion 签出导入,因为 Subversion 不会在本地保留整个历史记录。
由于您想要使用多个分支,因此您应该首先创建一个共享存储库,以节省分支时的磁盘空间和时间。
bzr init-repo ~/project
然后使用bzr checkout
命令从 Subversion 主干创建签出。指定项目主干的 Subversion URL。
cd ~/project
bzr checkout https://svn.example.com/project/trunk trunk
然后,您将在 ~/project/trunk 中拥有一个绑定到 Subversion 主干的 Bazaar 树。绑定分支意味着提交将自动推送到远程分支,即您在此处提交的任何内容都将提交到 Subversion 主干。
当您想要进行一些更改时,请从本地主干创建一个新的分支。
cd ~/project
bzr branch trunk fix-some-bugs
在 ~/project/fix-some-bugs 中工作并随时提交。所有这些都将在本地发生,不会影响 Subversion 主干。您可以根据需要创建任意数量的分支。
当您想要将这些更改提交到 Subversion 主干时,请将分支合并到您的本地主干。首先使用 确保您的本地主干是最新的bzr pull
。
cd ~/project/trunk
bzr pull
bzr merge ../fix-some-bugs
bzr commit
这会将您在分支中所做的所有更改作为 Subversion 中的单个修订版提交(即使您在分支中进行了多次提交)。
答案2
有一种方法可以继续中断的签出。如果您创建一个共享存储库,然后在其中启动签出,那么如果签出中断,您可以删除数据不完整的目录并重复签出命令。像这样:
bzr init-repo ~/project
cd ~/project
bzr checkout https://svn.example.com/project/trunk
# ... gets interrupted ...
rm -fr trunk
bzr checkout https://svn.example.com/project/trunk
只要需要,就重复结帐。
顺便说一句,一开始签出会非常慢,因为它会下载完整的历史记录。这也是为什么您不能只导入本地 subversion 签出的原因,因为 subversion 只下载单个修订,没有完整的历史记录。
签出完成后,您可以像使用 Subversion 一样使用分支。在开始编写新代码之前,您需要bzr update
从公司的项目中获取最新和最好的代码,当您想要提交时,您可以像往常一样提交,它将顺利提交给 Subversion。
您可以充分利用 Bazaar 的分布式功能。您在问题中描述的所有内容都可以使用 Bazaar 来实现,但要做到这一点需要对分布式版本控制有很好的理解。后端存储库服务器是 Subversion,这在实践中几乎没有区别,bzr-svn 插件使这一切变得透明。