CentOS 安装Git 服务器

关于Git

Git是分布式版本控制系统的一个完美实现,它与集中式版本控制系统SVN的基本区别如下:

1、Git是分布式的,而SVN不是

2、Git和SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。

3、Git将内容按元数据方式存储,而SVN是按文件

所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

4、Git分支和SVN分支的不同

SVN的分支就是版本库中的另外一个目录,而Git的分支却是整个版本库的一个快照,而且可以在同一个工作目录下快速的在几个分支间切换。

5、Git没有一个全局的版本号,而SVN有

SVN的版本号实际是任何一个相应时间的源代码快照。而Git并没有这样的一个全局版本号,这也是Git缺少的最大的一个特征

6、Git的内容完整性要优于SVN

Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

 

Git的基本工作流程如下:

在工作目录中修改某些文件。

对修改后的文件进行快照,然后保存到暂存区域。

提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。


Git的安装和配置

(1) 使用yum源安装git

yum install git

查看git版本号

git --version

输出:

version 1.9.0

(2) 创建git用户并设置密码

useradd -m git
passwd git //可以设置一个密码,建议不设密码

gitosis的安装

(1) python-setuptools的安装(因为gitosis的安装脚本是用python写的,已经安装过python的不需要再安装)

yum install python-setuptools

(2) gitosis 的安装

git clone https://github.com/cdiwo/gitosis.git //下载gitosis到你想存放的目录下
cd gitosis
python setup.py install //如果没有报错,则说明安装成功

(3) 创建是用这个git server的用户的公钥

因为gitosis的访问是通过ssh访问的,所以我们还需要创建一个ssh的访问公钥。找另外一台机器(如果条件允许)作为git server的客户端机器创建公钥,然后传到git服务器上。

su git
ssh-keygen -t rsa

一路按回车,默认会生成 /home/git/.ssh/id_rsa.pub 公钥文件,有了密钥以后便可初始化gitosis,使gitosis获得对Git的管理权限

su
gitosis-init < /home/git/.ssh/id_rsa.pub

如果使用另外一台客户端机器A生成公钥,那么将它传到服务器/tmp目录下再初始化gitosis也是可以的

gitosis-init < /tmp/id_rsa.pub

执行完成后,提示

Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/

表示初始化成功,会在/home/git/repositories创建gitosis-admin.git项目,可以通过维护这个项目来对gitosis进行配置。

除此以外,还需要对gitosis-admin.git/hooks/post-update目录赋上特殊权限:

chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update

至此,服务器端的gitosis配置就完成了。


Git 资源库和权限管理

(1) 创建并初始化资源库

cd /home/git
mkdir test.git
git init --bare

测试新创建的资源库是否可用

cd /home/test/
git clone /home/git/test.git

如果显示" Initialized empty Git repository in /home/git/test.git",则说明成功的clone了一个local repository。之后就可以在此repository下进行开发了,比如,添加一个readme.txt文件

vi readme.txt
git add . #注意后面有个".", 表示当前目录
git commit -a
git push origin master

注意:如果此时报错,最大的原因是test.git的refs和objects目录的权限不够,执行如下操作即可(git server端的repository下的这两个目录)。

chmod -R 777 refs/
chmod -R 777 objects/

(3) 检出 gitosis

git clone git@192.168.x.xx:/home/git/repositories/gitosis-admin.git

(4) 配置gitosis

cd gitosis-admin
vi gitosis.conf
# vi 会看到下面的内容
[gitosis]
[group gitosis-admin] #组名称
writable = gitosis-admin #可写资源库列表,多个资源库使用”空格“隔开
members = git@myname.local #用户列表,多个用户使用”空格“隔开

#如果新增一个可读写用户,需要将公钥复制到key_dir当中,并修改gitosis.conf文件

Git Hooks 自动部署

git 本地提交后,每次都要到服务器上pull才能更新代码,这是一件很麻烦事情,如果你的应用环境和git资源库在同一台服务上,那么我们可以使用git的hooks自动更新代码,下面提供一种最简单的操作方式:

(1) 创建 post-receive 文件

cd hooks
vi post-receive

(2) 修改 post-receive 文件,将下面的代码复制到打开的post-receive文件中

#!/bin/sh
export LANG=zh_CN.UTF-8
cd /home/wwwroot/test/code #服务器发布路径
unset GIT_DIR #注意如果没这句,将会提示"fatal: Not a git repository: '.'"错误
git pull origin master

(3) 给 post-receive 可执行权限

chmod +x post-receive

(4) 客户端执行pull操作

vi README #随便添加一个文件或内容
git add .
git commit -m 'Add README'
git push

执行完成后,如果提示"remote: error: 无法打开 .git/FETCH_HEAD",修改服务器发布路径中的 .git 文件夹权限为777。

其他

如果使用本地生成public密钥上传到服务器,需要将id_rsa.pub的内容添加到服务器~/.ssh/authorized_keys中,这样就可以免密码登录了。

cat id_rsa.pub >> authorized_keys

注意:目录.ssh和authorized_keys的权限必须是600

密钥的拷贝方式也可以在本地生成后,通过 ssh-copy-id 命令复制到服务器端:

ssh-keygen
ssh-copy-id git@serverhost

处理非标准SSH端口的git clone命令连接

使用git clone命令clone项目时,如果repository的SSH端口不是标准22端口时(例如,SSH tunnel模式,等等),可以使用如下命令:

git clone ssh://git@host:port/.../xxx.git

举例如下:

git clone ssh://git@120.27.50.136:2222/home/test.git

如需转载,请注明出处: https://www.chadou.me/p/167

最新发布