什么是git服务器?我觉得其实就是集中存放git仓库的服务器,只不过这些git仓库要对外开放,让其他人来连接和push代码。
当前服务器上集中管理的git仓库不是使用git init来创建的,而是使用git --bare init来创建的空白仓库,创建很简单,关键是如何管理和配置这些访问仓库的用户和访问的全县什么的。 其实我发现只要配置上gitolite,就可以相当于配置了一个git服务器
一、检测并安装git
git的安装,可以百度一下很简单在,这里就不多说了
git安装好之后,在第三步你想要管理的账号上执行下边命令,主要是这设置一下用户信息,方便git commit时git附带打上这些信息,以供记录
git config --global user.name "yourname"
git config --global user.email "[email protected]"
二、创建一个git用户,这个git用户算是一个其他用户访问git的一个入口
#git用户并使用/bin/bash作为登陆shell.
#在这里说一下有些教程可能会说设置git用户的shell为/usr/bin/git-shell为git用户的登陆shell.
#在我试验下,使用git-shell可以作为简单的使用,即创建一个仓库,让其他人连接上,这是可以的。但是设置这个是无法使用gitolite,应为这个shell不支持普通的命令
useradd -m git -s /bin/bash
#设置密码
passwd git
三、创建你想要管理git仓库的用户的sshkey.我这里是root用户。
假如这个用户根目录下已经村子.ssh文件和id_rsa和id_rsa.pub则可以忽略这一个步骤
创建秘钥很简单,执行ssh-keygen命令,然后一直空格即可(前提是你当前登录用户要是root)。当然这个是创建简单的秘钥,你如果要安全性高的,可以去百度一下如何使用ssh-keygen.
ssh-keygen
此处提前注意一下,加入你用root用户在git用户的根目录下创建了一些文件,请务必将这些文件的所有者设置为git即执行chown -R git:git filePath #-R命令是指同时将文件目录下的文件也设置所有者为git
如果忽略这一点,就会出现你及时配置好,但是使用的时候报错误,简单的错误提示权限不够,复杂的可能你要百度查一下才知道是这个问题,
笔者就是没人提醒,按照网上的教程写着执行chown,但是不明白为什么,生搬硬套老是出错。
登陆git用户(su git或者ssh连接git用户)
1、git clone git://github.com/sitaramc/gitolite # 获取gitolite的源码
2、mkdir -p $HOME/bin #为gitolite的二进制文件生成创建目录
3、gitolite/install -to $HOME/bin # 编译生成安装文件
4、安装和初始化gitolite,
这一步有两点需要注意,
第一点:必须用git用户来执行,不要想着使用sudo,因为gitolite会在执行命令的根目录建立一个repositories文件夹,加入你使用sudo的话,实际是将这个文件夹创建到了root用户上
第二点:gitolite初始化时需要设置一个用来管理gitolite的用户,实际就是指定这个用户的公钥,这个再初始化之后,你就可以使用root用户来管理gitolite. 这一项之后你可以再更改的。
将管理用户的公钥(.ssh/id_rsa.pub文件)复制到/temp下,并改为admin.pub
$HOME/bin/gitolite setup -pk /tmp/admin.pub # 安装并初始化,指定admin.pub公钥文件对应的用户为超级管理员
到此gitolite就已经配置和安装好了,之后就是如何使用gitolite来管理仓库了。
你要用它来进行管理,那还需要一定的操作。这里说一下,gitolite安装后本身是一个特殊的git版本库——gitolite-admin,分布式的进行修改,然后通过push的方式提交,其会通过钩子脚本执行权限更新。在上述步骤的最后一步执行完后会在git用户的根目录下创建一个repositories文件夹(这个文件夹就是以后存放git仓库的地方)并且gitolite自动生成了两个版本库:gitolite-admin.git和testing.git,其中的gitol-admin.git就是那个特殊的神奇版本库。所以,接下来我们要做的,就是回到你刚刚指定的超级管理员账户的电脑跟账户下,clone出gitolite-admin这个特殊的git版本库(当前情况下,只有该超级管理员账户可以clone并更新gitolite-admin这个版本库),然后根据自己的需要对其进行配置(如添加更多的管理员账户、添加新的版本库并为不同的用户指定权限)
su root# 回到指定的超级管理员账户
git clone [email protected]: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两个版本库。如果你在repositories下边在创建一个空白仓库,比如helloworld
现在使用git clone [email protected]: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
git commit -am 'add the helloworld repo and add RW+ to id_rsa'
git push
最后需要指一下,gitolite本身回在你git commit东西到gitolite-admin仓库的使用时执行钩子脚本来更新权限,但是有的时候,这个钩子他又不起作用,即没有跟对你的操作来更新权限。
这个情况下,如果你添加一个test用户,并且将test的公钥加入keydir和配置gitolite时,使用git clone [email protected]:helloworld时会报错误,错误消息是不存在helloworld仓库
这时因为你设置的这个用户的公钥,没有被钩子捕捉到并更新信息,只能你自己来做了,其实也很简单,就是打开git用户.ssh/authorized_keys文件的内容,在里边仿照内容加以一句信息
我的文件原有信息如下
command="/home/git/bin/gitolite-shell admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAppSWxxxxxb8V4UZkNRVTZxxxxxxxOItP0iMVj9xssCKJamq97eAnqCSe4xqgHuAN7WFSchbzPNPYP5/KyPzZ/mMkYiWNY4OHNPhrD1MjzPDJGSpRL3UEJ2PyPQBJNUEhpFhBvG+4+lTAcF76jYDFewY8Oi6OW2Ka9v9QFn69oJ3pOSG/kTkbURYKfpZpSuy3RkpbfHaxOi1TT0X8OvutlYtHrj8/PwJEJ1I3kFVTLCDTuMqU/7h8aCN2OIlZvTdkuDx4G/l30cm1V4WuqJSoaB/MOMHhjm9CQJ52TuMtW92QVJ7JdKaXbG3XuK9F/1gyfrwgnw==root@iZ25hhocgq6Z
这里边的每一行就是钩子本来需要去做的,你自己仿照上边格式的将test用户的公钥加上去,问题就解决了。这里注意一下 gitolite-shell 后边的参数,我贴出来的是admin,即公钥对应的gitolite权限管理的用户名,和gitolite.conf里的用户名。