作为单人开发者,我应该如何使用Mercurial?

63

我决定在一个小的个人项目中使用Mercurial。

我读到的大部分帮助文档都是关于在多个用户之间合并更改。由于我是单独工作,所以这不会发生。

我应该有多个存储库吗?我的开发计算机已经每晚备份到我的Windows Home Server,因此似乎没有必要再在其他地方建立第二个存储库只作为备份。

我应该每天进行分支吗?还是只在发布时或何时分支?

总的来说,你推荐哪些实践方法适用于使用Mercurial的单独开发人员?


2
你使用Mercurial的动机是什么?在我看来,对于单个开发人员来说,svn已经足够了。 - yanchenko
1
你应该使用标签而不是分支新版本。我已在下面回答了。 - Tim Post
1
有些人喜欢离线提交 :) 我喜欢做很多小的提交,然后再推送,同时保持一组有序的补丁,方便那些下载源代码 tgz 的人。我想这只是个人偏好。 - Tim Post
3
如果你只是单独开发者,为什么还需要使用svn呢?因为你需要建立一个svn代码库。我认同Mercurial对于单独开发者来说已经足够了。 - Joshua Partogi
13个回答

36
我使用Mercurial来开发FsCheck,这是一个在CodePlex托管的单元测试框架。目前我是唯一的开发人员,但偶尔会有人给我发送补丁。
具体地说,我在文件系统中有一个名为“FsCheck”的文件夹,在其中有一个存储库(命名为main),也就是文件夹,通常我还有几个相邻的文件夹,用于处理特定功能、错误修复等,例如bug-escapingexceptions和feat-statefulchecking以及patch-userFoo。这些都是使用hg clone创建的。
当我完成一个功能或bugfix时,我会提交该文件夹中的所有内容并将其推送到主干。可能还需要在主干上合并(hg commit,hg push,hg merge)。然后删除该文件夹(使用hg status和hg outgoing进行小心处理,确保不会丢失有用的东西)。
除了在发布前的最后清理工作(例如文档),我几乎从不在主干上工作。在发布之前,我会在主干上打标签,标记版本号(hg tag v0.5.1)。
CodePlex使用svn作为源代码管理工具。我只是用它来存储发布版本,为此我使用本地检出的SVN工作副本,将Mercurial存储库复制到其中使用hg archive。然后使用svn进行提交。这很原始,但它能用(在我的意见中,在Windows上使用Mercurial作为SVN“超级客户端”还不太用户友好)。
我还没有对之前的发布版本进行维护,但我会通过从该版本的修订版中克隆主存储库来完成这项工作(这很容易,因为我已经给它打了标签),然后在该分离的存储库中进行工作。将更改推送回主干的合并将非常容易。
总之:
- 一个文件夹用于存储项目的所有存储库,文件夹名称为您的项目名称 - 在该文件夹中有一个主要的存储库和一个临时存储库用于每个“工作单元”,其名称应描述该工作单元。
这样做很好,因为在文件系统中可以直观地看到您的分支和正在进行的工作。

为什么你把文件夹推到服务器之后就删除它? - Jay Bazuzi
这样我看到的文件夹就代表我正在处理的工作。如果我保留所有存储库,我将失去概述。历史记录可以从存储库本身使用hg glog查看(我用它来制作变更日志)。 - Kurt Schelfthout

30

从你提问的方式,我认为你可能对版本控制术语有一些误解。

每个项目应该有一个单独的代码库。你可以把代码库简单地想象成文件系统上的文件夹。当你在特定的文件夹中初始化Mercurial代码库时,该文件夹及其子文件夹中的每个文件都可以被添加到代码库进行版本控制。你不一定需要添加所有文件,但如果需要的话,任何文件都可以添加。

如果你想要将本地代码库推送到远程代码库,可以作为备份或与他人共享代码的方法。但如果这只是一个个人项目,这很可能是不必要的,尤其是因为你已经有一个备份解决方案了。

分支通常用于将项目的不同“版本”分开。正如一些人所提到的,这对于单独开发者来说很有用,可以尝试重构代码的方法,或测试解决特定问题的不同方法。如果不起作用,你不必担心回滚到哪里,你只需删除该分支。如果成功了,就将该分支合并回主要代码库(“主干”),然后继续工作。

如果您在代码上做了"发布"并需要维护旧版本,您还需要使用分支。例如,假设您发布版本1.0,有些人开始使用它。当他们在使用时,您在主干存储库中私下继续朝着下一个发布版本(比如1.1)添加功能。现在,有人发现了需要修复的1.0版本代码中的错误,但您不能只是在主干中修复它并将代码提供给他们,因为该代码未准备好发布。这时就可以派上用场1.0分支。您可以在1.0分支中修复错误,并将bugfix更改合并到主干中,以便在那里也修复该错误。然后,您可以重新打包1.0版本并添加bugfix,将其发送给用户,而无需想办法让主干处于准备发布的状态。
除此之外,在单独使用Mercurial时通常没有太多花哨的工作。进行一些工作,完成一个功能时,将其提交以获得一个"检查点",如果需要,您可以在将来回到该点。您不需要每次保存时都提交,只要在您觉得已经添加了一些相当重要的内容时提交即可。这将为您提供一个良好的项目历史记录,如果需要,可以随时查看。
如需更多信息,强烈建议花些时间阅读此书:使用Mercurial进行分布式修订控制。您并不需要深入研究高级主题,但至少阅读第1-5章和第8章将为您提供有关Mercurial和版本控制的良好介绍。

5
我使用的是与Mercurial不同的分布式版本控制系统,但我认为这并不重要。
在我的独立项目中,我经常使用分支。通常我有一个主要的开发分支(“trunk”),它应该始终具有工作版本。我的意思是单元测试和其他自动化测试都通过,并且所有代码都经过了这些测试,除了我明确排除测试覆盖范围的小部分。这确保了trunk始终处于良好状态以进行进一步的开发。
每当我开始进行更改时,我就从trunk分支创建一个新的分支。这使我可以自由地进行编码。例如,我可能不会担心自动化测试是否通过。由于它是一个隔离区域,我可以随意提交,而且我确实这样做:微型提交是分布式版本控制中我最喜欢的功能之一。当分支中的工作完成后,我将其合并回trunk。
这种工作方式的好处是,如果我正在进行的更改是一个坏主意,那么我可以轻松地撤销。事实上,没有什么需要撤销的,因为这些更改还没有被合并。
有时我很懒,不会为我正在开发的新事物创建一个新的分支。不可避免地,当我需要比预期更多的时间来完成工作时,这被证明是一个错误。当我需要在其中间做另一个无关的更改时,情况会变得更糟。当我遵循所有工作都在自己的分支中的风格时,可以将不相关的更改放在其自己的分支中,将其合并到trunk中,然后另一个分支可以从trunk中合并更改(如果需要)。

5
我每天都使用Mercurial,可以在这里看到。我还在少数几个支持Mercurial的免费主机服务之一ShareSource提供帮助(我在信用页面上)。自从Xen放弃BitKeeper以来,我一直在使用HG。
对于个人项目,我建议您尽量避免使用分支。Mercurial对于分支的概念与您所期望的有很大不同。其他系统如Git使分支(和疯狂的想法)更容易。但是,只有在需要简单、便宜的分支时,我才会使用Git。
我使用hg的典型日常:
(See where I left off)
# hg status 

(See what I was doing with foo)
# hg diff -r tip src/foo/foo.c

(Finish one module, commit it)
# hg commit src/foo/foo.c

(Push changes)
# hg push

合并也很简单,从相关存储库中拉取特定修订版本也很简单。但是,如果你是单独工作的,如果出现合并冲突,你可能没有更新远程存储库。
我开始了一些个人爱好项目,一年后它们变得非常受欢迎,我很高兴我使用了HG。它的语法接近于Subversion,非常直观和极其便携。
当然,是的,我使用Git和SVN..但不是用于个人项目。关于我的存储库索引(发布的链接),我用PHP重新编写了hgwebdir,因为我想轻松修改其外观并从每个存储库中提取RSS。
简而言之,对于个人使用,你会发现它非常友好。提交,标签等都很简单..除非你真的需要,否则避免使用分支。
这是我写的一篇教程,介绍如何使用Mercurial管理网站,在设置密钥,hgrc等时可能会对你有用。

3

这些通常与任何软件项目的工作方式相同。仅拥有或不拥有版本控制已经无需讨论 ;)

通常,当您的功能准备好时,您只需提交即可。由于您有备份,因此不需要每天提交以确保您的工作得到安全存储。

对于分支:在我的个人项目中,我主要使用它尝试想法,例如当我有另一种解决相同问题的方法时。为此,我也喜欢Git的stash命令。

但是我确实有多个代码库。我有一个带有shell访问权限的托管服务,可以将代码推送到该服务。因此,无论我在哪里工作,无论我使用的是哪台工作站(在工作场所:当我有时间编码时,在家中的台式机以及在父母家时使用的笔记本电脑),都可以与该存储库同步。


2
我不知道为什么你想要多个代码库,因为你已经在备份存储库的机器上备份了你的代码。
也许你会为自己创建一个分支,比如说你想调查一个功能,但又不想在主代码分支中搞乱。
但是也许你会从我之前提出的 问题 中提取一些东西。

1

我之前使用过CVS、Perforce和Subversion作为我的个人版本控制系统,大约两周前开始使用Mercurial :-) 在工作中,我们使用MS Team System...

对我来说,最值得注意的新功能是在不同机器之间轻松传输。在工作中,我有一些存储在Mercurial repo中的东西(使用hg作为Team System的超级客户端)。我定期将所有更改推送/拉取到/从我的笔记本电脑上,这样我就可以在两台机器上拥有完整的历史记录。

在家里,我也会从笔记本电脑上推送/拉取repo。

因此,我可以在任何地方工作(在家办公使用强大的计算机,在路上使用笔记本电脑或在工作中),而不必担心会丢失更改。好吧,偶尔我需要合并两个更改,但那很少会有问题...在我看来,hg做得非常好。

此外,Mercurial的“设置成本”相当低。你阅读一篇教程,安装它,输入“hg init”,然后继续工作。不再需要决定某些东西是否属于你神圣的SVN服务器,放在哪里等等。Mercurial的“摩擦力”比SVN的低一些。


0
SCM是编辑器的一种“智能”撤销缓冲区扩展。您可以回到过去,可能已经解决了一个问题,但删除了它,因为它已被重构,但您需要再次找到解决方案等。设置视觉差异,它会告诉您自上次提交或在过去两天内更改了什么,我不断地审查我的代码并在不喜欢旧解决方案时进行更改。
分支是在流上工作的:当您开始朝一个方向前进,但需要更多思考,同时您想在其他事情上工作时,它可以帮助您。
请注意,DVCS将存储库处理为单个单位。您可以逐个文件提交(使用过滤器),但它们将更改存储在整个存储库中。这使得cvs(svn)用户感到困惑,其中单个文件更改更为常见。

0
我总是使用Git或Mercurial,即使一个人也是如此。
当我想要将一些可重复使用的组件提供给其他项目时,我会分离仓库。 我配置了这样的功能,当我提交代码时,它也会自动推送(我用的是Tortoise HG插件),因为有时候我会忘记推送,而当我在地理位置发生变化时,我需要那些代码,明白吗?
所以,这就是我的建议。

0

我认为这取决于您是否正在维护现有应用程序并同时添加功能(或修复大型错误)。

这样,您可以在自己的分支中创建新功能,同时修复主分支中的错误。

我对我的应用程序正是这样做的,但使用本地版本的CVS。此外,如果新开发人员加入您的团队,您就可以开始工作了。

我同意这与备份是两个不同的问题。

祝好运,
Randy Stegbauer


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