1.利用custom_hooks的post-receive钩子,实现自动更新
打开另外一个终端,以管理员身份进入/home/hp/文件夹,新建一个文件夹git_backup,直接git clone一个项目下来,这里我clone的是自己的测试项目test。
打开之前的终端在custom_hooks文件夹下添加post-receive的shell脚本,没有后缀(以我的电脑路径为例:/var/opt/gitlab/git-data/repositories/root/Test.git/custom_hooks):
修改权限:chmod 777 post-receive
也可以修改为其他权限,但要保证它可以执行(gitlab官网上说,需要修改其所有者为git,我的电脑上不这样修改也可以执行,具体参看我的上一篇文章)。
#!/bin/sh
echo "custom post receive -------------->>"
dst=/home/hp/git_backup/Test
cd ${dst}
unset GIT_DIR
git --work-tree=${dst} pull origin master
切换到另外一个终端,修改/home/hp/Test目录及其所包含的文件属性
为了简化操作,我直接修改其属性(可以不需要这么多权限,起码要保证它可以执行),命令为: chmod -R 777 Test
2.用客户端git来测试
此时的客户端git和服务器端在同一台电脑上,只是目录不同,
客户端git目录在/home/hp/gitTest/Test
服务器git目录在/home/hp/git_backup/Test,如果是在两台电脑上就可以看到更清楚。
在客户端git目录下修改了文件,然后提交git commit -a,添加注释后提交到本地库,然后git push,就可以看到服务器端的custom_hooks的post-receive钩子被调用,执行了pull操作,这样就达到了自动更新服务器/home/hp/gitTest/Test的git库的目的。
以下部分可以跳过,我踩过的坑,记录一下————————————————————————————————————
3. 利用全局hooks中的post-receive实现批量更新
当时把hooks目录下的三个ruby版的钩子屏蔽了,此时每个项目对应的custome_hooks里的钩子不能生效,只能尝试用一种笨办法解决,就是用hooks文件下的全局钩子。如果在客户端push之后,post-receive被调用,这这里能调用每个项目的shell脚本去pull一遍,这样不就可以实现自动更新了么?
思路:这里的post-receive可以是shell脚本,该脚本要实现的功能就是调用某一个目录下的所有shell脚本,并且执行一遍。
每个shell脚本要做的事情就是更新对应项目的文件。注意:hooks文件夹下原来的三个钩子文件不要删除,大家先做好备份,直接改后缀名,加上.simple
思路有了,现在这用这样的笨办法解决:先建一个测试文件post-receive如下,修改其权限可执行
#!/bin/sh
for file in /home/hp/post_hooks_dir/*
do
sh $file
done
采用的是绝对路径,你可以在某个地方新建一个文件夹,然后用shell脚本去遍历你自己的目录,然后执行该目录下的shell脚本。
如果收到了remote: error: cannot open .git/FETCH_HEAD: Permission denied
这样的报错,就自己去修改需要更新的git仓库的文件的属性。
正常是是这样信息:
4.在原来的ruby版本的钩子执行我们的shell脚本
把3中的shell脚本写成一行,在ruby中调用,这样就可以不影响原来的ruby全局钩子。
可以采用在post-recevie的钩子里执行我们的shell脚本,就可以了。
在post-receive里添加一行
system 'for file in /home/hp/post_hooks_dir/* ;do sh $file;done'
这里的目录就是你自定义的目录/home/hp/post_hooks_dir/,用来统一存放所有需要执行的脚本,实现工程的自动更新。建议是按照工程名,建立同名的shell脚本,每个shell脚本的内容可以参考本文1中的,只需要自己改对应的文件路径即可。这样全局钩子,每次从客户端有push过来时,会调用hooks里的post-receive钩子,这个钩子里会去执行我们的那句shell脚本,然后这个脚本会去/home/hp/post_hooks_dir/执行所有脚本(每个脚本对应一个项目,进行git pull origin master)。