Git服务器使用Hook进行自动部署

在进行以下操作时 一定要注意文件的权限问题,绝大部分的问题出现是由于文件权限的问题

在服务器端创建git仓库

第一步,安装git:
$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:
$ sudo adduser git
第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是 /web/52inlove.git, 在 /web 目录下输入命令:

$ sudo git init --bare 52inlove.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

$ sudo chown -R git:git 52inlove.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

在服务器初始化一个服务器本地的 Git 仓库

这个仓库就是通过 git init 初始化出来最常见的本地仓库,它的作用是拉去远程仓库(其实就在它旁边)最新的源码到网站的根目录。

git clone /web/52inlove.git #从远程仓库 clone 出源码

为远程仓库(git服务器)设置 Hook

$ cd /web/52inlove.git/hooks
#post-receive 这个文件可能不存在 新建即可
$ vim post-receive 

post-receive内容

#!/bin/sh

echo 'Hook is running'
unset GIT_DIR
DeployPath="/web/www/52inlove"
cd $DeployPath
sudo chown -R www-data:www-data $DeployPath
sudo chmod -R 775 $DeployPath
git fetch --all
git reset --hard origin/master
echo 'Hook finishes !!! :)'
exit 0

phpstorm push结果如下

Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 340 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Hook is running
remote: Fetching origin
remote: From /web/52inlove
remote:    98da1ad..cad5e4f  master     -> origin/master
remote: HEAD is now at cad5e4f fix title
remote: Hook finishes !!! :)
To 52inlove.com:/web/52inlove.git
   98da1ad..cad5e4f  master -> master

如果出现以下情况

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 git@192.168.1.X:/var/git.server/.../web  
! [remote rejected] master -> master (branch is currently checked out)  
error: failed to push some refs to 'git@192.168.1.X:/var/git.server/.../web' 

解决方法

这是由于git默认拒绝了push操作,需要进行设置,修改.git/config文件后面添加如下代码:

[receive]  
denyCurrentBranch = ignore  

最后

  • 本地的工作环境 git remote 地址为 git@52inlove.com:/web/52inlove.git
  • 将需要操作该仓库的用户的public ssh key 复制到服务器git用户家目录下的.ssh/authorized_keys

git将本地仓库上传到远程仓库

1. git init
2. git add .
3. git commit -am "###"      -------以上3步只是本地提交
4. git remote add origin git@xx.xx.xx.xx:repos/xxx/xxx/xxx.git
5. git push origin 本地分支:远程分支