安装 gitolite 搭建 git 服务器¶
本文讲解在ubuntu上安装gitolite,为客户端提供git仓库服务器功能。ubuntu版本:server 16.04
环境配置¶
安装gitolite前,要安装 git,openssh-server和 openssh-client
$ apt-get update $ apt-get -y install git openssh-server openssh-client
SSH密钥配置
$ ssh-keygen -t rsa -C "yourname@example.com"上传公钥
将公钥上传到服务器备用,比如是/tmp/YourName.pub
添加git用户¶
添加git管理用户gitadmin
$ useradd -m -d /data/db/gitadmin -s /bin/bash gitadmin
$ su - gitadmin
$ ssh-keygen -t rsa
$ cd .ssh
$ mv id_rsa gitadmin
$ mv id_rsa.pub gitadmin.pub
添加git仓库用户
$ useradd -m -d /data/db/git -s /bin/bash git
$ cp gitadmin/.ssh/gitadmin.pub git
$ chown git.git git/gitadmin.pub
安装gitolite¶
登录到git用户
$ su - git
确保 ~/.ssh/authorized_keys 文件不存在或者为空
$ mkdir .ssh $ chmod 700 .ssh把公钥拷贝到git主目录下
# 上边已经复制过,不需要操作以下命令 $ cp /data/db/gitadmin/.ssh/gitadmin.pub $Home/gitadmin.pub
下载并安装gitolite
$ git clone https://github.com/sitaramc/gitolite $ mkdir -p $HOME/bin $ gitolite/install -to $HOME/bin
初始化gitolite, 同时配置管理员
$ $HOME/bin/gitolite setup -pk gitadmin.pub # 运行此命令后会在.ssh文件夹中生成 authorized_keys 文件 $ cat .ssh/authorized_keys #///////////////////////文件内容//////////////////////////////////////// # gitolite start $ command="/data/db/git/bin/gitolite-shell gitadmin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLEz4ATHj+07/PHJheOTaPN2Vr9HGWy80Pujx2UoTFRak88W0BhW7JO/IlTpO30JHw72bQ6u24ZP4DbafuKZLIG2PYtYfVyhIsbNJp9U8BR0G3CQJZGYgh4znpYKkFV2HhXwzFOpEcpBoVYnzJ2y/rmgBocHLc22KLYVDVMam9F2qm715lhWlccfJzAcePvvOnHkgUJESWGm2OJcbyeT1nrL+nkgqpNyrfc2nIZKqBXuxr7+aHT4YuGQ6lyHUR0CstJeB43KGDM+pxJEqXfOla1Jb2HKWyG1wiuFUrOaRHoPjhWsAB371aMbHJtM+nJV+PWZ5ccl/nZnd83CbDvlPV gitadmin@hhk-op-01 # gitolite end #/////////////////////////////////////////////////////////////////////// #退出git用户 $ exit
克隆管理库到本地¶
不要直接在服务器上创建和管理仓库,仓库管理是通过叫gitolite-admin的仓库进行的,这个仓库在初始化gitolite时就已经生成了,管理员可以克隆到本地进行配置,在客户端执行
$ su - gitadmin
$ git clone git@127.0.0.1:/gitolite-admin.git
#>>>>>>>>>>>>>>>输出内容>>>>>>>>>>>>>>>>>>>>>>>
Cloning into 'gitolite-admin'...
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#需要以下操作
如果提示输入密码,编辑客户端的~/.ssh/config文件,添加以下内容:
#添加文件
$ cat ~/.ssh/config
#///////////////////////////////文件内容////////////////////////////
Host 服务器地址
HostName 服务器地址
User git
Port 22
IdentityFile ~/.ssh/gitadmin
#//////////////////////////////////////////////////////////////////
#在运行命令
$ git clone git@git:/gitolite-admin.git
$ cd gitolite-admin/
$ vim conf/gitolite.conf
#///////////////////////////////文件内容////////////////////////////
###########################################
# user and group
############################################
# general
@admin = gitadmin ebj-hhk
@cm = @admin
@op = @cm hhkgit
@confuser = @cm hhkgit
############################################
# repo groups
############################################
@apps_repos = apps/rainbow apps/mountain apps/forest apps/hail apps/lake apps/glacier apps/inverse apps/hamster apps/sunlight
@conf_repos = conf/rainbow conf/mountain conf/forest conf/hail conf/lake conf/glacier conf/inverse conf/hapoxy conf/hhk-web-01-nginx conf/hamster conf/sunlight conf/hhk-web-01b-nginx
repo gitolite-admin
RW+ = @cm gitadmin
repo testing
RW+C = @cm
RW+ = @all
repo @apps_repos
RW+C = @op
repo @conf_repos
RW+C = @confuser
#///////////////////////////////文件内容结束///////////////////////////////////
$ git add .
$ git commit -m "add"
#出现错误
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account is default identity.
Omit --global to set the identity only in this repository.
fatal: empty ident name (for <gitadmin@hhk-op-01.(none)>) not allowed
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#运行以下命令解决
$ git config --global user.email "gitadmin@example.com"
$ git config --global user.name "gitadmin"
$ git commit -m "add"
$ git push
添加用户和仓库¶
gitolite-admin里面两个文件夹keydir和conf
keydir存储用户的公钥,添加用户可以直接拷贝用户的公钥到此文件夹
conf目录里的gitolite.conf是配置文件,格式如下:
repo gitolite-admin RW+ = gitadmin repo testing RW+ = @all
比如要添加一个仓库'foo',并给alice,bob和carol不同的权限,首先把他们的公钥(alice.pub,bob.pub,carol.pub)拷贝到keydir;然后编辑conf/gitolite.conf添加:
repo foo
RW+ = alice
RW = bob
R = carol
最后把修改push到服务器:
$ git add conf
$ git add keydir
$ git commit -m "added foo, gave access to alice, bob, carol"
$ git push
服务器会自动添加用户到~/.ssh/authorized_keys,并且添加一个新的空仓库’foo’。
上述操作完成后,alice、bob和carol就可以将仓库克隆到本地:
$ git clone git@服务器地址:foo
查看对仓库的操作权限,可以在客户端执行
$ ssh git@服务器地址 info
访问规则示例¶
gitolite的访问规则功能强大,以下是示例:
repo foo
RW+ = alice
- master = bob
- refs/tags/v[0-9] = bob
RW = bob
RW refs/tags/v[0-9] = carol
R = dave
规则解释:
alice对所有branch和tag拥有所有权限--create, push, delete, rewind/overwrite等等
bob可以创建或者fast-forward push名字中不以’master‘开头的branch,可以创建不以v+数字开头的tag
carol只可以创建v+数字开头的tag
dave只有只读权限,可以clone/fetch。
管理组¶
某些时候使用组来管理用户是非常方便的,下面是两个组:
@staff = alice bob carol
@interns = ashok
repo secret
RW = @staff
repo foss
RW+ = @staff
RW = @interns
组成员可以累加,下面对@staff的定义和上面的效果是一样的:
@staff = alice bob
@staff = carol
组也可以包含其他组:
@all-devs = @staff @interns
@all是一个特殊组名称,既可以指所有的仓库,可以指所有的用户。
常用命令¶
客户端可以通过ssh远程执行一些命令,以下命令可以查看帮助:
$ ssh git@host help
info是最长用到的命令,在命令后跟上’-h’可以查看命令的用法。
在服务器端有非常丰富的使用命令,运行gitolite help查看详细信息。
gitolite 丢失管理密钥/访问权限¶
登录到服务器,切换到 git 用户
$ su - git
使用完整路径克隆管理员仓库:
$ git clone $HOME/repositories/gitolite-admin.git temp
$ cd temp/conf
$ vim gitolite.conf
# 将gitolite-admin仓库的管理权限修改为你自己的账户或者gitadmin
# 保存并退出
$ git add .
$ git commit -m '修改管理权限'
# 如果错误运行:
$ git config --global user.email "git@co-gro.com"
$ git config --global user.name "git"
# 运行 gitolite 命令
$ gitolite push
# 或者:
$ gitolite push -f
# 或者:
$ ~/bin/gitolite push
注意,这是 'gitolite push',而不是 'git push'
实际操作时,发现上面步骤不好使:需要将命令修改为:~/bin/gitolite push,原因可能是是命令没有注册,需要指定路径。