git作为php开发者常用的一款分布式版本控制系统,在工作中我们可能会遇到要自己搭建git服务器的情况,在此简单介绍下在linux系统下如何搭建git服务器,希望对大家有所帮助。
1、安装git
Linux服务器端:#yum install -y git
安装完后,查看 Git 版本
[root@localhost ~]# git --version
git version 1.8.3.1
Windows客户端:
安装完之后,鼠标右键可以使用 Git Bash 作为命令行客户端。
安装完之后,查看 Git 版本
$ git --version
git version 2.10.2.windows.1
2、服务器端创建git用户并设置密码
[root@localhost home]# id git
id: git:无此用户
[root@localhost home]# useradd git
[root@localhost home]# passwd git
3、在服务器端创建裸仓库
设置 /git/gittest.git 为 Git 仓库
然后把 Git 仓库的 owner 修改为 git
[root@localhost ~]# mkdir /git
[root@localhost ~]# git init --bare /git/gittest.git
Initialized empty Git repository in /git/gittest.git
[root@localhost ~]# cd /git
[root@localhost git]# chown -R git:git gittest.git
4、在客户端clone远程仓库
在你需要存放项目文件的目录下鼠标右键,打开Git Bash,输入clone命令
$ git clone [email protected]:/git/gittest.git
由于还没有配置公钥,首次克隆会提示输入git用户密码。
5、配置公钥
在Windows用户主目录下,先看看有没有.ssh目录,如果有再看看有没有id_rsa和id_rsa.pub两个文件。如果没有,那就打开Git Bash,输入命令进行创建:
$ ssh-keygen -t rsa -C "[email protected]"
此时 C:\Users\用户名\.ssh 下会多出两个文件 id_rsa 和 id_rsa.pub
接下来要打开linux服务器的rsa认证,进入 /etc/ssh 目录,编辑 sshd_config,打开以下三个配置的注释:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
保存并重启 sshd 服务:
[root@localhost ssh]# /etc/rc.d/init.d/sshd restart(注意:部分系统版本可能会报文件不存在的错误,因为不同系统其重启sshd的命令不同,如centos7的命令应为:systemctl restart sshd.service)
由AuthorizedKeysFile得知公钥的存放路径是 .ssh/authorized_keys,实际上是$Home/.ssh/authorized_keys,由于管理Git服务的用户是git,所以实际存放公钥的路径是/home/git/.ssh/authorized_keys,在/home/git/下创建目录.ssh,然后把.ssh文件夹的owner修改为git.
回到客户端的 Git Bash 下,导入文件:$ ssh [email protected] 'cat >> .ssh/authorized_keys'
此时需要输入服务器端 git 用户的密码(注意这里的ip地址为你们自己服务器的ip地址)
回到服务器端,查看 .ssh 下是否已经存在 authorized_keys 文件。(其实也可以自己新建authorized_keys文件,然后将id_ras.pub文件里的公钥复制进去就可以,一般多客户端操作就是直接在后面追加各个客户端的公钥在后面)
authorized_keys文件其实就是这样子的,每一行放一个客户端的公钥
重要:为了服务器的安全,我们需要设置一下文件的权限
修改 .ssh 目录的权限为 700
修改 .ssh/authorized_keys 文件的权限为 600
[root@localhost git]# chmod 700 .ssh
[root@localhost git]# cd .ssh
[root@localhost .ssh]# chmod 600 authorized_keys
完成以上操作后,以后我们再clone就不需要输入密码了。
6、实现自动同步到站点目录
至于网站的运行环境怎么搭建这里就不赘述了,我们假如你在home/wwwroot下有个网站目录kaky,我们现在要做的就是当git仓库gittest.git发生更新时自动同步到我们的网站目录kaky上。
为了完成这个功能我们需要用到git的钩子功能(hooks),关于hooks更深入的知识大家就自行去搜索学习吧。
服务器端:进入我们的裸仓库:/git/testgit.git
cd /git/testgit.git
cd hooks
//这里我们创建post-receive文件
vim post-receive
//在该文件里输入以下内容,wq保存后退出
#!/bin/bash
git --work-tree=/home/wwwroot/kaky checkout -f
//将该文件用户及用户组都设置成git
chown git:git post-receive
//由于该文件其实就是一个shell文件,我们还应该为其设置可执行权限
chmod +x post-receive
现在我们就可以更新客户端的文件,然后push到服务器端试试,看看文件是否会同步到网站目录kaky上。
如果你在Git推送的工程中发现推送成功 但是在www目录下并没有自己的代码,这时候你可要注意了:这是由于文件夹的权限的原因造成的!
假设你的www目录的所属的用户组为root,你可以将你的git用户加入这个组;并给git添加写入权限,或者其他解决方法,反正你要服务器上的git用户有权限进入www文件夹。