一些废话
对于使用CVS/SVN出身的人来说,Git始终有点难上手(比如我),因为概念较多,一时理不清,尽管网上已经有很多教程,其实后来我发现,要掌握它的办法就是使用它,着手开始用它做源码管理,有问题就解决问题,见招拆招,这样就成了。
本文并非将Git怎么用的,如果对Git缺乏基本的了解,那这里有一个不错的教程:Git教程
大家都知道,Git是分布式的,如果仅仅只有一个本地库的话,一来不利于协同工作,二来也不够保险,万一本地硬盘坏了呢?所以即便是一个人在做开发,也最好找一个远程的代码库来托管。可以选择自己架一个,但稍微有些麻烦,并且由于没有公网固定ip地址,只能在局域网里用用,一旦在家办公就不轻易能检出代码;另一个选择就是用现有的代码托管服务,最最著名的无疑是github.com,但github.com只能免费创建公共容器,也就是说所有人都能看到的容器,如果要创建私有容器只允许自己的人看到的话,要付点钱,虽然也不算贵,现在不是有种观点“能用钱解决的就不要花时间”么?但由于一些众所周知的原因,github.com在大陆访问是不是会出现些不稳定的情况。那国内有没有类似github.com这样的代码托管服务呢?答案是肯定的,开源中国提供的就很不错:git.oschina.net,而且,即便是创建私有容器,它也是免费的,太棒了,我目前用下来大致上OK,有时候会稍微有点卡,但都可以接受。
一点原理说明
Git的身份验证方式和SVN有些不同,SVN可以使用自带的SVN协议和简单的用户名/密码机制验证用户身份,而Git则可使用https或ssh的连接方式,加系统用户名/密码验证,或者通过在服务器端保存用户公钥的方式来验证用户身份。很明显,oschina的做法是在服务器端保存用户公钥这种方式,因为不可能给成千上万的用户都创建系统帐号。服务器端一旦有了用户的公钥,就可以验证用户身份了,(能用这个公钥解开的密文,一定是用对应的私钥加密的,谁有对应的私钥,当然是对应的用户了)所以我们要做的是将我们的公钥上传到服务器上去,这样服务器就认我们了,根本不再需要额外的用户名/密码。我们下面也将采用ssh的方式来使用远程Git服务。
ssh的首次连接
这里还稍微有点点小问题要说明一下的,https协议通常是使用一些权威机构颁发的证书,你去访问https的时候就能够通过证书来确认这些网站的身份是可信的,而ssh则通常使用自己生成的证书,你怎么确定你要链接的那个服务器的身份呢?如果那个服务器是个假冒服务器,那怎么办?所以第一次用ssh连接远程服务器的时候,会给出类似的提示:
这是Windows环境下使用的SSH Secure Shell客户端的提示,在*nix下大致如此:
提示会给出远程主机公钥的“指纹”来让你确定其真实身份(因为公钥很长,很难用肉眼比对,所以做了个指纹摘要供用户查看),如果确定,就点“Yes”,在*nix环境下,会将这个公钥信息保存到~/.ssh/known_hosts文件中,下次就无需再询问你了,下面第一次连接远端服务的时候若是出现类似的确认,就不要感到奇怪了。
注册与创建项目
好,前面只是提提原理,以便大家理解,下面言归正传,讲讲如何用oschina的git托管服务。
第一步当然是先注册,到“http://git.oschina.net/”去,然后……注册过程很简单,不用说,你提供的email就相当于是你的用户名了。
注册完登录。然后就可以创建自己的“项目”了,项目就相当于容器,比如我创建了一个容器叫git_test。
这个时候也先别急着把你的本地容器push上来,你还没上传你的公钥呢,对吧?
生成和配置公私钥
要上传公钥,得先做一对公私钥,否则上传什么?使用ssh-keygen来做这个事情。(Windows的话先弄个cygwin)
打开:“https://git.oschina.net/keys”,点“添加公钥”,标题随便输,我习惯性地写自己电脑的名字,比如“guogangj’s Mac”,公钥的内容可以这样获取到:“cat ~/.ssh/id_rsa.pub”。把内容完整填入文本框中即可,注意不要随意在中间添加换行回车空格啥的。
保存,输入密码确定,这样就把公钥存到服务器上去了。顺便说一下,如果你想知道这个公钥的指纹的话,可以这样:
这样服务器端的配置就算完成了,测试一下:
若出现了一些意外的话,可以参考一下这个:可能的解决方案
Git的配置
本文当然不会告诉你具体怎么去使用Git,但在正常push和pull之前,我们还是有些东西要配置一下的。下面是配置用户名和email,这是全局配置的,不只是对一个Git容器生效,配置会被保存在“~/.gitconfig”中。
$git config --global user.name "guogangj"
$git config --global user.email "[email protected]"
另外还可以配置一下要忽略的文件的列表,有些文件不必加入到Git中嘛,比如生成的.o文件,一些用户相关的配置啥的,以XCode为例,可以生成这么一个文件“~/.gitignore”,内容如下:
#Exclude the build directory
build/* #Exclude temp nibs and swap files
*~.nib
*.swp #Exclude OS X folder attributes
.DS_Store #Exclude user-specific XCode files
*.xcworkspace
xcuserdata
再设置一下:
git config --global core.excludesfile=~/.gitignore
配置完成。使用起来还是非常简单的,clone的方法:
$git clone [email protected]:guogangj/git_test.git
“[email protected]:guogangj/git_test.git”这个地址可以在项目主界面上得知:
完了之后可以看看remote的选项:
$git remote -v
这样就可以轻易的pull和push了。