我已经使用Git大约一年了。我最初的兴趣是作为SVK的替代品,我有过一些糟糕的经历(当svk出现问题时,它们会变得非常错误)。不过,我为什么要使用分布式版本控制系统?
- 我每年出差几次。我经常有很长的停留时间,或者酒店和/或会议场所的互联网连接不稳定或昂贵。我需要一种继续工作的方式,这样我就可以继续进行原子提交,而无需担心我是否可以访问网络。
- 我在家工作。这使我在工作地点方面具有很大的灵活性。有时我在自助洗衣店工作——当我这样做时,我经常会带来一份我想解决的问题清单。然而,我去的自助洗衣店没有连接。(就我而言,这是一件好事;我被迫专注于我的错误列表。)
- 合并。Subversion是一个很棒的工具,但合并通常会很痛苦。git中用于合并的工具令人难以置信,我很少遇到冲突。Subversion,另一方面……哇哦。虽然我可以相对轻松地解决冲突,但我喜欢首先避免它们。如果您需要说服力,找个时间试试
gitcherry-pick
。 - 易于安装。ZF源占用大量磁盘空间,当我检查了多个分支、主干和孵化器时,大小会膨胀。此外,尝试确定要放在
include_path
上的内容会变得很疯狂,尤其是在运行测试时。 - 制作原型。我经常喜欢在实验性分支工作,我知道我不会与其他任何人发生冲突——但也不关心提交历史,只要我合并我需要主干的更改即可。使用subversion,我必须创建一个分支,这意味着不必要地添加到存储库历史记录。
Git的svn集成提供了一个功能集,可以解决我所有的问题。此外,在本地克隆git+svn
存储库的能力让我可以在任何给定时间拥有多个可用版本——这可能非常有用当需要区分标签、针对不同版本测试网站等时。
克隆用于git的svn存储库的最简单方法是使用gitsvninit
或gitsvnclone
。使用这两种方法,您将git指向一个SVN存储库并告诉它一些关于布局的信息(主干在哪里,以及分支和标签在哪里),它会创建一个远程到svn存储库的本地git存储库。例如:
$ git svn init --trunk=trunk --tags=tags --branches=branches http://framework.zend.com/svn/framework/standard
以上将在当前目录中初始化一个指向ZF标准存储库的git存储库。您可以将开关简化为简单的--stdlayout
,因为上面反映了Subversion对存储库布局的标准建议。
注意:我使用了gitsvninit
,然后是gitsvnfetch
。这允许我指定一个我想从中启动我的存储库的修订版。相信我:您不想尝试克隆整个ZF存储库。除了repo的大小,我们还在2008年5月中旬更改了布局——这使得克隆有问题。初始化并从最近的修订中获取;我亲自重建了mycheckout几次,最近一次是从2009年4月底的1.8.0版本开始的。
然而,采埃孚有一个不同之处给我带来了一个问题:孵化器。我们将孵化器放置如下:
standard |-- branches/ |-- incubator/ |-- tags/ `-- trunk/
换句话说,它是“branches”、“tags”和“trunk”的兄弟——并且不符合正常的范例。我的问题是如何通知git它的位置。
事实证明答案非常简单。在存储库的.git/config
文件中,存储库初始化后您将拥有以下内容:
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [svn-remote "svn"] url = http://framework.zend.com/svn/framework fetch = standard/trunk:refs/remotes/trunk branches = standard/branches/*:refs/remotes/* tags = standard/tags/*:refs/remotes/tags/*
要添加孵化器,我们添加一个额外的svn-remote
,将其指向孵化器,告诉它从哪里开始获取提交,然后检查新分支。
首先,要添加新的svn-remote
,只需将以下行添加到上面的.git/config
文件中:
[svn-remote "incubator"] url = http://framework.zend.com/svn/framework/standard/incubator fetch = :refs/remotes/svn-incubator
然后,从给定提交远程获取孵化器上的svn提交;我自己用的是dr15241:
$ git svn fetch incubator -r 15241
然后,检查本地的孵化器分支。这就像任何其他远程分支一样工作-您检查本地分支,并指示要使用的远程:
$ git checkout -b incubator svn-incubator
上面创建了一个本地“incubator”分支,它指向之前在配置文件中创建的远程“svn-incubator”。
最后,使用标准svnrebase引入自该修订版以来的所有其他提交:
$ git svn rebase
从现在开始,您现在可以在孵化器、主干和您创建的任何其他分支之间来回切换,只需使用svncheckout
。
对于正在使用或考虑使用git的ZF开发人员,我希望这篇文章对您有所帮助。如果你有兴趣尝试一下,我也可以提供我自己存储库的压缩包;如果您有兴趣,请给我发电子邮件(请注意,它并不小……)。