版本管理

眼下最流行的”版本管理系统”,非 Git 莫属!

关于是否使用 SVN? 个人的建议是如果团队有权限管理、代码安全控制等考虑的话,那么考虑 SVN,否则建议使用 Git/Mercurial,
关于 Mercurial 还是 Git,因为 GitHub 这个大社区的缘故,因此如果是程序员个人搞开源的话,还是建议优先 Git,如果 Git、Mercurial 您都想试试,那么这里打个广告:强烈建议您试试 BitBucket,Mercurial 和 Git 都支持,重要的是支持无限个私有库(业界良心),用来搞私人项目真心好,1024 个赞!Google Code 在 2008 年曾经有一个关于 Git or Mercurial 的分析文章(DVCSAnalysis : Analysis of Git and Mercurial),不过时间很久了,仅供参考。Google Code 也即将被大扫除掉了~ :-(

Git

Git Flow

Github Flow

扩展阅读

Subversion/SVN

SVN 版本库布局 - trunk, branches, tags

SVN Flow? :-)

SVN 版本库只是一个包含目录和文件的文件系统,而且它的文件系统是版本化的,并且实现了” 廉价”拷贝,让它的这种操作比传统文件系统廉价很多,但是版本库本身还是像一个文件系统。

至于版本库中目录的名称,只是一种习惯,他们在 SVN 中没有特别含义。我们在一些著名开源项目的版本库中,通常可以看到 trunk、branches、tags 等三个目录。

由于 SVN 固有的特点,目录在SVN 中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。

  • trunk 是主分支,可以认为是项目的开发主线,你可以称之为 main、master 或任何你喜欢的名字。
  • branches 是分支。一些阶段性的 release 版本,这些版本是可以继续进行开发和维护的,则放在 branches 目录中。人们因各种目的使用分支,你或许希望通过特性分支或客户修改分支来隔离你的发布或维护分支等。
  • tags 目录一般是只读的,这里存储阶段性的发布版本,对作为里程碑的版本进行存档。通常情况下 tags 与分支的区别就是 tags 一旦创建不能修改,你也可以将标签目录叫做 releases 或任何你喜欢的名字

开源社区采纳了多种常用布局作为最佳实践,我们应该遵循推荐的布局方式,按照这些布局约定,大家可以方便的访问版本库找到所需要的信息。

有两种常见的版本库布局:

第一种布局是版本库包含一个项目或一组紧密联系项目的最佳选择。

  1. Project
  2. ├─trunk
  3. ├─branches
  4. └─tags

这个布局非常好用,因为分支与标签整个项目或一组项目会非常简单,只需要一个简单的命令:

  1. svn copy url://repos/trunk url://repos/tags/tagname -m Create tagname

这可能是最常用的版本库布局,被许多开源项目采用,就像 Subversion 本身和 Subclipse,这是大多数主机站点,如Tigris.org、SourceForge.net 和 Google Code 遵循的方法,这些站点的每个项目有自己的版本库。

另一种布局是针对一个版本库包含不相关项目的最佳选择。

  1. ProjectA
  2. ├─trunk
  3. ├─branches
  4. └─tags
  5. ProjectB
  6. ├─trunk
  7. ├─branches
  8. └─tags

在这种布局里,每个项目会存在顶级目录里,然后该目录之下创建 trunk/branches/tags,其中与第一种布局相同,这只是将项目放到自己版本库方式的替换,他们都在一个版本库中。 Apache 软件基金会使用这种布局方式来存放他们的所有项目在一个版本库。

通过这种布局,每个项目都有自己的分支和标签,可以很容易使用一个命令创建分支和标签,就像前面展示的:

  1. svn copy url://repos/ProjectA/trunk url://repos/ProjectA/tags/tagname -m Create tagname

这种布局可以简单的创建同时包含 ProjectA 和 ProjectB 的标签,你可以这样做,但是需要多个命令,你也要决定是否创建一个特别的目录存放这种分支和标签,如果你需要经常这样做,你或许应该考虑第一种布局。

扩展阅读

Mercurial/hg

扩展阅读

相关工具

服务端

  • Gitlab - 自建 Git 平台的多数都用 ta 啦,Github fork~?
  • Gogs - Go Git Service - Go 语言开发的轻量级 Git 管理工具(不喜欢随大流的同学们有福啦~)
  • VisualSVN - Windows 平台下很多人的选择
  • iF.SVNAdmin - Web 版 SVN 管理工具(PHP)
  • USVN - Web 版 SVN 管理工具(PHP)

客户端