git,看到这个总想起linus在思考Merge window时的名言“digg用户是‘手淫的海象’”。囧orz

说破大天,一个没有公开发布机制的版本管理系统也是胡扯。除非富得流油,我们往往会选择一些公开的版本管理托管服务(hub)。来公开发布我们到版本管理系统。这里主要介绍几个git托管服务的网站。以及将git仓库托管出去的通用流程。

<li><a href="http://github.com">github</a>:
  • 提供私有和开源两种仓库托管服务

  • 软件库提供WIKI、Issuses等功能,项目管理提供dashboard等功能,账户提供blog、站内邮箱等功能

  • 好像特别出名的样子

  • 免费用户:磁盘空间限额300M,软件库个数不限,但必须开源。收费用户可以有私有软件库、多项目等服务

<li><a href="http://unfuddle.com">unfuddle</a>:
  • 提供私有仓库托管服务

  • 免费用户磁盘空间限额200M,不限制仓库数量

  • 项目管理相关的功能很齐全,比如公告板啊、投票系统啊、记事本啊、项目里程管理、站内消息等等

<li><a href="http://repo.or.cz">repo.or.cz</a>:
  • 服务器性能、带宽、访问速度不错。

  • 用户账户管理的功能很简单,甚至可以说简陋。除了设置ssh密钥外貌似没别的功能

  • 项目(仓库)和用户是独立的,每个项目磁盘限额400M,超过了需要申请,没有付费的说法

  • 项目可以直接自动镜像别的git仓库,也可以像传统的那样自己push。

  • 没有任何项目管理的功能

这里有必要说一说SSH密钥的问题,可能很多人在使用git,尤其是用托管的时候经常会遇到的问题。各个git托管服务基本上都涉及SSh密钥认证push,关于SSH密钥对的知识问Google。在使用托管服务前我们需要先在本地生成一个ssh密钥(对)。这个密钥对包括本地和公共两个部分。里面可以包含密码等信息。生成方法如下:

这样就生成了一个密钥对。保存在~/.ssh目录下,本地密钥保存在id_rsa中,公共密钥保存在id_rsa.pub中。

在服务商那里申请到git托管服务的时候,需要给用户或者项目添加用于push时认证的SSH公共密钥。添加时往往会有一个标题、一个值。标题随便输入,用来区分不同的公共密钥的。比如你在公司到电脑里生成过一个,在家里的又生成了一个。内容就是id_rsa.pub的内容:

虽然所有到服务商都有这个过程,但是却不尽相同。

通常情况下,有项目管理功能的(如上面的github、unfuddle),都有两个地方可以添加公共密钥。一是账户设置里,二是具体的软件仓库(项目)里。通常在账户设置里的密钥各个软件仓库(项目)都可以继承,而各个软件仓库(项目)的却不能相互继承。而且即便是继承的账户设置里到密钥,在软件仓库(项目)的密钥管理界面里也是看不到的。所以经常出现在某个仓库A里添加了密钥,另一个仓库B里push的时候却没权限。而在B里添加密钥的时候却又提示密钥重复(虽然管理界面里看不到)。

而没有项目管理功能的(如上面的repo.or.cz),就比较简单了。这种情况下软件仓库(项目)是完全独立于账户的,也没有密钥管理设置一说,只能添加具有push权限的用户。然后你可以在用户设置里设置密钥。

另外值得提醒的是,有些服务商(比如repo.or.cz)虽然可以添加多个密钥,但是多个密钥是输入在同一个输入款里,用分行的方式隔开的。

认证完密钥,我们就可以push我们的git仓库了。如果你本地还没有建立git仓库,先建立之并作一个初始化的提交:

需要注意,git是不跟踪空目录的。所以初始化版本的时候你好歹弄一个README,才能正常提交到仓库里。

建立好本地仓库后,就可以将提供git的hub服务的push地址添加进来了。

这里的origin是一个代号,用于在本地代表这个远程地址。当然也可以添加很多个远程地址,分别用不同的代号,然后push到各个远程地址。不过origin这个代号比较特殊,他代表该远程镜像是本仓库的原始仓库。当别人用git clone克隆你的仓库的时候,会自动在克隆出的仓库加上一个远程地址,代号就是这个origin。

gitpush地址在服务商那里创建软件仓库的时候会给出。需要注意的是通常会给出多个地址,其中一部分是用于公共clone的,匿名只读权限。另一部分是用于有权限的人push的,SSH认证读写权限。这里要添加的是SSH认证的push权限的地址。

然后我们就可以push了:

记住首次push要添加“push分支”参数,以后如果还是把这个分支push出去的话,这个参数可以省略,直接: