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