搭建git服务器及配置gitosis管理用户权限

  最近,软件部需要一个版本控制系统,经过讨论,我们选择了git。对于git和其他版本控制系统如SVN、CVS的区别比较大家可以自己上网查阅。下面我们开始安装git服务。

一、安装git

[root@centos ~]# wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz

ps:网上一些文档给的下载地址是无效的,当然我们也可以到github下载

[root@centos ~]# tar xvf git-latest.tar.gz 

[root@centos ~]# ls

[root@centos ~]# cd git-$(date)/       

[root@centos ~]# yum install autoconf automake

[root@centos git-$(date)]# autoconf

[root@centos git-$(date)]# mkdir -p /usr/local/git/

[root@centos git-$(date)]# ls /usr/local/   

[root@centos git-$(date)# ./configure --prefix=/usr/local/git

[root@centos git-$(date)]# make

在此遇到了一些问题,一些git需要的包没安装,之前已经安装了部分,此时我缺少的是,

[root@centos git-$(date)]# yum install curl curl-devel expat-devel

我们应该以自己的系统为准,先安装,错误提示缺少什么再安装什么,这也会是我们经验积累的一个途径,一般git依赖以下几个包:curl curl-devel zlib-devel perl cpio expat-devel gettext-devel。

[root@centos git-$(date)]# make install

[root@centos git-$(date)]# git --version

git version 1.7.12-rc2

到此,git安装成功。建议学习下git的相关操作,即使你自己不写代码,不使用版本控制系统,接下来配置gitosis会用到。


二、安装及配置gitosis

  git的服务管理工具有gitosis、gitolite,个人比较喜欢gitolite,但因为刚学习了git,有些概念还不清楚,鉴于gitosis的资料比较多,感觉比较好掌握,就选择了gitosis,在以后难免会迁移到gitolite。

开始安装gitosis:

下载gitosis:

[root@centos gitosis]# git clone git://github.com/res0nat0r/gitosis.git

安装gitosis时我们使用python setup.py install所以要先安装python的setup tool,用ez_setup.py安装。

[root@centos ~]# wget http://peak.telecommunity.com/dist/ez_setup.py

[root@centos ~]# python ez_setup.py 

[root@centos ~]# python -c "import setuptools"    //测试setuptool是否装上,无输出即装上。

安装gitosis:

[root@centos ~]# cd gitosis/

[root@centos gitosis]# python setup.py install

gitosis安装结束,接下来进行配置:

[root@centos ~]# useradd -s /bin/bash -d /git/ git          

/git为放置版本库的位置。

ps:网上有些文档指定shell环境为/bin/sh或者/bin/nologin,我建议先指定/bin/bash配置完成后再usermod进行修改,这是因为之前我配置时因为自己的一些错误加上环境变量,gitosis在初始gitosis-admin库时始终出错,困扰了我好几天。

[root@centos ~]#su - git 

[git@centos ~]$vi .bashrc

在末尾添加export PATH=/usr/local/git/bin:/usr/local/git/libexec/git-core:$PATH 。 环境变量一定要添加上,不然会报错。

在开发的机子上生成公共密钥:

ssh-keygen -t rsa   //如果在windows下一般也安装了msysgit可以进入git bash 或者也有生成公钥的工具。

上传密钥到服务器:

scp ~/.ssh/id_rsa.pub root@xxx:/tmp/

环境变量生效后在服务器上进行gitosis-admin管理版本库初始化,:

[git@centos ~]$ gitosis-init <</tmp/id_rsa.pub

初始化后的管理版本库位于/git/repositories  建立其他版本库也应该在这里。如何配置权限、新建版本库、更新等,大部分是git相关命令,也足够在写一篇博文了,就不写了。接下来我就记录几个自己遇到的问题。

问题一、

[root@centos ~]# sudo -H -u git gitosis-init < /tmp/id_rsa.pub 
Traceback (most recent call last):
  File "/usr/local/bin/gitosis-init", line 8, in <module>
    load_entry_point('gitosis==0.2', 'console_scripts', 'gitosis-init')()
  File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 24, in run
    return app.main()
  File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 38, in main
    self.handle_args(parser, cfg, options, args)
  File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 138, in handle_args
    user=user,
  File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 75, in init_admin_repository
    template=resource_filename('gitosis.templates', 'admin')
  File "/usr/local/lib/python2.7/site-packages/gitosis-0.2-py2.7.egg/gitosis/repository.py", line 63, in init
    close_fds=True,
  File "/usr/local/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/local/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

出现这样是环境变量出了问题,你可以用root直接执行 gitosis-init < /tmp/id_rsa.pub 看是否会出现同样的问题。当然root的环境变量记得加上。如我的是git的安装目录下这两个目录bin、libexec 。之前因为是自己出错把git下的lib和libexec放在/root结果无论怎样设置git用户的环境变量,cp还是添加软链接总是提示出错。加sudo命令也是出错,后来才知道sudo命令后并不继承root,或者git用户的环境。加上之前怀疑python安装有问题,一直测试、搜索,这个问题困扰了好几天。能肯定的是如果出现上面提示的极有可能是环境变量的问题。

问题二、

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To [email protected]:/var/git.server/.../web
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '[email protected]:/var/git.server/.../web'

这是因为你在初始版本库是不是建立裸库即加上--bare参数,git服务器拒绝了push命令,设置下就可以了

[git@centos tt.git]$ git config receive.denyCurrentBranch "warn"

一般来说初始git时也应该设置user.name  user.email。

你可能感兴趣的:(Date,centos,git,服务器,perl,版本控制系统)