您的位置:首页 > 其它

git简介、安装、基本操作——Git折腾小记

2013-03-09 22:15 387 查看
这两天刚完成了一个小项目,整理资料发现现在写代码跟文档又没有版本控制的意识,刚好前两天电脑出问题,差点所有代码跟文档全丢掉,所以这两天又在自己的台式机上架起了git,做所谓的代码服务器,之前折腾过一次,因为时间原因没有总结下来,结果这次弄的时候,又得满世界找资料,所以这次准备总结一下,也做了一个参考资料汇总,以备以后再折腾时用。

git简介

git是干嘛的呢?记得听哪位大牛说:没有版本控制意识的程序员,都不是好程序员!如果你认同这句话,那么Git就是用来帮助你成为好程序的。Git应该是当下最受人推崇的版本管理系统了(仅仅是感觉,没有依据),之所以受推崇,除了因为它是Linux内核开发者Linus Torvalds最初开发的,其确实有很多其他版本控制系统所没有的特点,否则其也很难管理像Linux内核项目这样的超大项目。那么它有什么特点了?

首先,与以前广为流行的SVN不同,git是分布式的,其没有服务器端与客户端之分(虽然在项目管理过程中,一般会人为地指定某一台非开发用的机器作为“服务器”,但就git自身功能来说,完全可以没有这个台“服务器”,至于实际中为什么会有,后面将会讲到)。

然后,git的分支(branch)与合并(merge)功能非常强大与智能。据维基百科所说:git最为出色的就是它的合并跟踪(merge tracing)能力。作为SVN与git的用户,亲身体验告诉我,git提供的分支间代码合并功能的确非常强大,很少出现需要手动合并代码的情况,即使出现,其提供的冲突提示与解决方案也非常方便跟简单。

最后,它是开源的,它正在变得越来越强大跟方便,同时,好用配套工具也越来越多,使得git的使用与管理更简单方便。

当然,它一样是有缺点的,比如其学习曲线相对比较抖,但是只要你想学,网上系统的资料越来越多了。本人现在也基本算入门,本文也仅仅是一个备忘录,权当一个可能不大好的入门材料。本文的最后列出了一些可以更系统学习的资料。同时,git自身没有权限控制,需要额外的权限控制工具,但是现在也有不错的工具可以弥补了,本文也有举例介绍我自己当前在用的。

好,闲话说得够多了,下面开始介绍git的安装,包括git本身的安装,以及“服务器”上一些配套的管理工具的安装,包括用于权限管理的gitolite,用户web浏览文件的gitweb。

git安装

git安装

git自身的安装其实是很简单的,不论是windows下还是Linux下(以我自己用的ubuntu为例),尤其是如果你仅作为“客户端”(即别人不会直接从你的电脑上clone代码,不会向你的电脑提交或者获取代码),你只需要跟安装一个普通软件一样傻瓜式安装即可:

windows下直接下载可执行安装程序 msysgit (选择git for windows 或者 msysgit都可以),然后双击运行,根据提示安装即可,非常简单!

Linux的安装也很简单,尤其如果你用的Ubuntu或者Debian等有本地包管理系统的linux系统,一条命令即可解决问题(Ubuntu为例):
sudo apt-get install git-core


非常简单吧!(当然,除了跨平台可能是git的优势跟特点外,安装简便肯定不是它的特点,因为很多其他软件也一样……)
但是,如果你是在为你的小组或者自己配置专门的代码服务器,供所有成员备份代码、共享代码、交流代码、合作开发,你可能就需要一些额外的工作了。仍然以Ubuntu系统为例,参考这篇文章,记录一下整个配置的过程:

首先,git的数据交换跟交互是基于ssh的,所以为了使所有成员都能从该机器上获取和提交代码,需要给系统配置ssh服务,当然,如果你已经配置了ssh服务,那么这一步就可以省了,所以你可以先通过下面的命令查看下自己是否已经配置了ssh服务:
ps -ef|grep "sshd"


如果你能看到一些sshd相关的进程信息,则说明你已经有这个服务了,否则(或者你想更新的话),使用下面的命令安装openssh
sudo apt-get install openssh-server openssh-client


然后,安装git“服务器”
sudo apt-get install git-core


再然后,为自己配置身份信息,这样多个人提交代码的时候,就可以方便的查看是谁提交的,该如何联系ta了(如果该机器只做服务器,不做开发,本步骤应该可以省略)
git config --global user.name "yourname"
git config --global user.email "your@email.com"


以上步骤是每个git用户都需要的,接下来,作为“服务器”,为了更好的管理,我们需要进行一些必要的配置!包括环境的配置、管理工具的安装与配置等。

首先,我们最好为其配置一个专门的git用户并设置密码,专门对代码进行管理
sudo useradd -m git
sudo passwd git(change to yours)


说明:上述命令生成一个用户名与密码均为git的账户,也可以自己创建别的用户名跟密码,只要进行相关操作(比如clone)时指定用户名即可(本文章一律以git为例),-m 选项是让其在home目录下生成用户的主文件夹,我们的代码仓库会布置在这个主文件夹下。

然后,在新建的git用户主目录下创建一个文件夹作为git的仓库,并为这个仓库配备最基本的安防——权限控制
sudo mkdir /home/git/repositories # 最好使用repositories作为文件夹名称,这样可以简化后面的操作
sudo chown git:git /home/git/repositories
sudo chmod 755 /home/git/repositories


至此,一个简单(非常简单)的git服务器已经搭建好了,可以自己创建一个简单的工程测试一下。

为了方便后面的操作,我们先切换到git用户下
su git
在respositories下新建一个目录(仓库),并切换到这个目录
mkdir helloworld
cd helloworld
在此处初始化一个空的仓库(只能接受push/pull代码,不能本地commit)
git --bare init
好了,一个空的仓库建立好了,用另外一台安装了git的机器(比如你的开发机)测试一下,此处假设你上面所用的服务器IP为192.168.0.123
git clone git@192.168.0.123:/home/git/repositories/helloworld
然后在开发机上进行一些基本操作测试:为这个项目add一些文件,然后commit,然后push,如果除了要几次输入git用户的密码外,其他一切正常的话,那说明上面的安装与配置就已经成功了

在上面的测试过程中,是不是发现那个clone的路径好长,很容易错?几个步骤都需要输入git用户的密码(clone、push),是不是很烦,而且照这个节奏,每增加一个开发成员,就得告诉他git用户的密码,是不是既繁琐又不安全?所以,如果能clone的时候只要指定项目名称,clone/push/pull自动完成身份认证,并且最好能对不同的仓库给予不同用户不同的权限,那就好了!接下来介绍的工具与配置就可以搞定这一切,让git仓库的管理变得更简单,操作更方便!

首先,针对身份认证的问题,我们前面已经提到git的数据交换与操作都是基于ssh的,所以,我们的身份认证自然可以通过配置ssh来解决。ssh是通过密钥进行认证管理的,密钥包括一个公钥(交给服务器)和一个私钥(自己保留),每个公钥对应一个私钥,每个私钥也只对应一个公钥。。。。此处省略若干字。。。。,所以一个简单的解决自动身份认证的方式就是:每个需要访问代码仓库的人员,在自己的机器上通过ssh-keygen生成自己的公钥与私钥,将公钥提交给服务器,服务器管理员将改用户的公钥添加到服务器git用户的.ssh/authorized_keys文件中,可能用到的命令如下(Ubuntu终端/Windows下使用Git
Bash):

# 某开发机上
ssh-keygen #接下来一路回车就好了,在默认目录下生成默认密钥文件
cp ~/.ssh/id_rsa.pub /path/to/one/visiabl/fold/ #将隐藏文件夹下的公钥文件拷贝到一个可以文件夹下(如果接下来用scp提交,此步骤可省略)
# 将上面的公钥文件以某种方式提交给服务器

# 管理员在服务器下
# 将开发机提交上来的公钥文件,添加到/home/git/.ssh/authorized_keys文件中(每行一个)


这种方式可以在开发人员较少,管理的仓库较少的时候使用,因为简单,但是其权限控制比较单一(均可以read/update代码),而且如果人一多,要管理authorized_keys文件也是个头疼的事情,所以不是很推荐这种方式,建议采用后面介绍的工具。
然后,对于默认路径的问题,这个我真的只知道通过下面的管理工具来配置了。所以,接下来介绍一个git仓库的开源管理工具gitolite

gitolite安装

gitolite官方介绍是这样的:Hosting
git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features.如其所述,它的主要功能就是对git仓库进行权限控制,并提供其他很多给力的方便管理的特性。其实我本来是要介绍gitosis的,但是自己在弄的时候,gitosis的配置出了一个非常诡异的问题,不管我怎么配置,甚至重新安装从零开始配置,总是再我更新它的配置文件后,之前的配置就不起作用了,折腾了我一天,最终发现了它的升级版——gitolite,所以决定采用它了。它们的本质都是上面介绍的ssh验证,只是它们提供更方便的管理方式,然后自动生成authorized_keys文件。这两个工具最有意思的一点就是,它们自身就是一个特殊的git版本库(gitolite-admin),他们的管理与配置都可以通过git的方式,分布式的进行修改,然后通过push的方式提交到服务器,服务器会通过所谓的钩子脚本自动更新权限控制文件。
下面介绍它的安装,它的官方主页上有详细的安装介绍,我这权当翻译跟经验分享。
首先,因为我的git仓库是在git用户下,所以,切换或者登陆到git用户下
su git
上面说过,gitolite本质就是根据你的配置,自动生成authorized_keys文件,所以它要求你的authorized_keys文件必须是空的,或者不存在,所以我们干脆删了它(请注意一定要切换到git用户,否则,误删除了其他用户下的authorized_keys文件导致服务器的其他功能受影响,那就悲剧了,这应该也算是为什么要专门弄一个git用户来管理的原因吧)
rm ~/.ssh/authorized_keys
然后,gitolite在初始化时需要通过某一用户的公钥文件指定一个超级管理员,gitolite安装成功后,只有这个超级管理员可以更新gitolite以更新各种权限控制(包括对其自身的更新权限控制),所以在初始化时需要指定该超级管理员账户的公钥文件(最好直接将其拷贝到git用户的主文件夹下)(下面的示例程序使用同一服务器上的另一常用管理员用户admin)
su admin
ssh-keygen
sudo cp ~/.ssh/id_rsa.pub /home/git/id_rsa.pub
su git
好~准备工作已经完成了,开始安装gitolite
cd ~ # 回到git主文件夹下
git clone git://github.com/sitaramc/gitolite # 获取gitolite的源码
mkdir -p $HOME/bin  #为gitolite的二进制文件生成创建目录
gitolite/install -to $HOME/bin  # 编译生成安装文件
$HOME/bin/gitolite setup -pk id_rsa.pub # 安装并初始化,指定id_rsa.pub公钥文件对应的用户为超级管理员
Bingo! gitolite安装完成!不过,你要用它来进行管理,那还需要一定的操作。上面提到,gitolite安装后本身是一个特殊的git版本库——gitolite-admin,分布式的进行修改,然后通过push的方式提交,其会通过钩子脚本执行权限更新。看一下上述步骤的最后一步你会发现,gitolite自动生成了两个版本库:gitolite-admin.git和testing.git,其中的gitol-admin.git就是那个特殊的神奇版本库。所以,接下来我们要做的,就是回到你刚刚指定的超级管理员账户的电脑跟账户下,clone出gitolite-admin这个特殊的git版本库(当前情况下,只有该超级管理员账户可以clone并更新gitolite-admin这个版本库),然后根据自己的需要对其进行配置(如添加更多的管理员账户、添加新的版本库并为不同的用户指定权限)
su admin # 回到指定的超级管理员账户
git clone git@192.168.0.123:gitolite-admin.git # clonegitolite-admin这个特殊的版本库
如果上面的步骤都成功了的话,应该可以查看到有一个gitolite-admin的文件夹,文件夹下有两个目录conf、keydir
如果你回到git用户,查看repositories目录(如果之前创建仓库时,创建的文件夹不是repositories,gitolite会自动创建这个文件夹,并将该文件夹作为默认访问时的默认路径),目录下就会多了gitolite-admin.git与testing.git两个版本库。

有没有发现,这次clone的时候,后面的路径变短了?密码也不用输了?腰不酸腿不痛了?对,你没猜错,这一切gitolite已经自动帮你搞定了:默认路径是/home/git/repositories,权限控制是只有当前的超级管理员用户可以访问gitolite-admin和testing两个版本库,你之前测试创建的版本库也已经无法访问,如果你尝试再次clone之前创建的测试版本库,应该就会提示如下错误信息:
# 假设你之前创建了helloworld版本库,现在使用git clone git@192.168.0.123:helloworld试图clone
FATAL: R any helloworld id_rsa DENIED by fallthru
(or you mis-spelled the reponame)
fatal: The remote end hung up unexppectedly

要继续访问之前创建的项目,需要将这个项目添加到gitolite的权限控制内,下面演示一下为当前的超级管理员用户指定之前创建的helloworld测试版本库的读写权限(可读可写),以此演示gitolite指定权限的一般流程:
1、将需要指定权限的用户的ssh公钥文件,存放在gitolite-admin版本库的keydir目录下(如果提交的都是id_rsa.pub,可以将其重命名为该用户的id或者名称,同时也推荐这样重命名,以明示哪个公钥文件是哪个用户的),因为我们初始化时,gitolite已经将该超级管理员的公钥文件自动拷进去了,所以省略此步骤
2、编辑conf目录下的gitolite.conf文件,添加helloworld版本库管理组,为超级管理员指定读写权限(RW+,具体的权限定义,参考gitolite官方文档)
repo helloworld
RW+  =   id_rsa


3、commit到本地
git commit -am 'add the helloworld repo and add RW+ to id_rsa'


4、push到git仓库
git push


如果push成功,当前超级管理员用户应该就可以成功clone helloworld版本库,并进行添加、删除、修改与push等操作了。
以上便是一个经典的管理过程,至于具体的权限控制、配置文件的格式、更多高级功能等,如果都介绍的话,这文章也太长了,所以读者还是参考官方文档(简单介绍详细版本)吧,顺便学学英语。

一个基本的git服务器算基本完成了,当然如果要管理好,里面涉及到管理细节(不论是技术细节,还是管理策略)还有很多很多,我自己现在也只知道些皮毛,同时因为没有大项目的代码管理经验,都是我自己的小打小闹,所以就完全不敢出来献丑了,更多技术细节,大家可以查看官方文档,有机会我也许会再做点笔记分享,至于管理策略,推荐这个:A successful Git branching model ,这个也有”中文版“

git基本操作

其实这个已经有很多不错的资料了,所以也就懒得自己写了,罗列一点自己看过的资料好了:
我第一次接触git时,大哥推荐给我的资料:Git魔法,有pdf版本的,读者自己找找吧,如果没找到,也可以找我要,仅限学习~
git官网貌似一直就没上去过,看看这个中文翻译版本
一个不错的git简易指南
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: