每次在本地push代码至git服务端后,然后再到线上的开发web目录中执行git pull操作拉取本地push的代码,久而久至觉得很麻烦,便想能不能每次本地push代码后,线上的协同开发web站点自动的pull拉取代码,于是便有了以下的方案:
准备工作:
1、 git服务端仓库放在目录 /var/www/html/git/abc.com
2、 git客户端文件存放在目录(作为web站点目录) /var/www/html/abc.com
开始工作前想的步骤如下:
1、打开 git仓库的hooks目录
把post-receive.sample文件改名为post-receive,该文件的作用是当git服务端接收到客户端的push后,自动执行post-receive该文件
2、编辑/var/www/html/git/abc.com/hooks/post-receive文件
#!/bin/sh
cd /var/www/html/abc.com
git pull origin develop:develop
想象大功告成。。。
现实的情况是:
当我在本地客户端push代码后发现服务器/var/www/html/abc.com 这个web目录并没有成功 pull 到最新的数据,并且终端上也有报错(remote: fatal: Not a git repository: ‘.’)。
一番折腾后,说是hooks目录中执行文件还是会调用该git仓库中的GIT_DIR 这个环境变量
post-receive文件钩子的代码改成下面的之后,运行正常了:
export GIT_WORK_TREE=/var/www/html/abc.com #设置git客户端(同时为web站点目录)的目录路径
export GIT_DIR=${GIT_WORK_TREE}/.git #设置GIT_DIR的路径
cd ${GIT_WORK_TREE}
git pull origin develop:develop
来到这里心想着,大功告成,哈哈。。。
然而现实总是残酷的…
当我在本地客户端push代码后发现,服务端的钩子还是git pull 不成功,提示
错误git host key verification failed
一番折腾后, 发现是我当初创建服务器git 仓库的时候用的是git 这个用户, 而我在服务器上生成公匙却是用root这个用户ssh-keygen –t rsa去生成公匙,并把公匙文件放在/home/git/.ssh/ authorized_keys文件中,这样当我一直用root用户在服务器上的git客户端(同时为web站点)的目录中去执行 git命令的时候是没有问题,但是却不知道如果我用git用户去执行git的pull push等等命令是不能用的。
于是,在服务器中切换git 用户,并且ssh-keygen –t rsa 重新生成公匙,并添加进/home/git/.ssh/ authorized_keys文件中
做完这个,心急的我,马上在本地的客户端执行push 命令,结果还是 git host key verification failed
*……&*&%%¥……%¥…¥…… 之后,发现我还需要以git用户在服务器中的git客户端(同时为web站点)的目录中去执行 git的命令, 比如 git pull origin 仓库 ,这样git 会提示你确认以公匙的形式操作, 就是因为这个 yes 的确认…..
继续…
在本地执行push 代码
结果还是报错
fatal: Could not read from remoterepository.
Please make sure you have the correct access rights and the repository exists.
一番折腾后,发现/var/www/html/abc.com 我的服务器git 客户端目录(同时为站点目录)下的文件的所有者为root,于是乎就想到是权限的问题
chown –R git:git abc.com 把文件所有者改为git
再次在本地执行push 命令
终于,钩子起作用了,/var/www/html/abc.com 目录成功pull 拉取了我本地的push文件。
总结,整个过程中,务必注意以下三点:
第一、 post-receive钩子文件的GIT_DIR环境变量问题
第二、 服务器是否以git用户去生成公匙,并且添加到authorized_keys文件,并且去执行一次服务器git客户端的拉取等命令,目的是确认刚添加的公匙以后都用来访问git服务端
第三、 确保你的git 客户端和服务端 的所有文件的,权限所有者为git这个用户
以上是本人搭建hooks钩子过程遇到的问题,希望能帮到有需要的朋友,另外如果说的不好或有错误的地方也恳请大家指出。