1.Server端
第一步.创建初始化一个裸仓库(用来添加钩子函数)
git init --bare test_git_hook_function.git
第二步.通过裸仓库创建一个用来存放代码的仓库
git init test_git_hook_function
#/home/git/test_git_hook_function.git是上面创建的仓库地址
git remote add origin /home/git/test_git_hook_function.git
git clean -df
git pull origin master:master
第三步.创建钩子并赋权限
cd /home/git/test_git_hook_function.git/hooks
touch post-receive
chmod +x post-receive #赋予可执行权限
第四步.编辑钩子内容
#!/bin/sh
app_dir=你的代码目录 (例如: app_dir=/home/git/test_git_hook_function)
cd $app_dir || exit
unset GIT_DIR
# dosomething
...
第五步.测试钩子是否能运行
sh post-receive #或者 ./post-receive
2.client端(新玩法)
此处用的ssh方式,亦可以使用http
玩法说明:本人在gitee上面已有一份代码库,想将代码上传递到服务器(线上打包部署)
gitee上面的仓库代码留作备份,服务器上面的仓库用来作钩子部署
第一步:克隆代码
方法一:
git clone origin git@gitee.com:gitee_user_name/test_git_hook_function.git
方法二:
git init test_git_hook_function #关联远程代码仓库
git pull origin master:master #拉取代码
git remote -v #查看现在对应的远程仓库
origin git@gitee.com:gitee_user_name/test_git_hook_function.git (fetch)
origin git@gitee.com:gitee_user_name/test_git_hook_function.git (push)
第二步:新增一个推送仓库地址
git remote set-url --add origin your_user_name@your_server_ip:origin_code_library_address
例如: git remote set-url --add ssh://git@166.12.35.98[:端口]//home/git/test_git_hook_function.git
git remote -v #查看有没有添加上去(此时有三个)
origin git@gitee.comgitee_user_name/test_git_hook_function.git (push)
origin git@gitee.com:gitee_user_name/test_git_hook_function.git (fetch)
origin ssh://git@166.12.35.98//home/git/test_git_hook_function.git (push)
第三步:推送代码 (前提条件有配置ssh,否则可能会出现推送失败)
#远程仓库的钩子函数也会被触动(有日志的话,会显示)
git push origin master:master
3.课外话
修改远程地址: git remote set-url origin 你的新地址
hooks目录下的文件讲解(加上sample后缀,是为了避免触发)
ClientSide hooks:
pre-commit:当执行commit动作时先执行此hook,可以用此hook做一些检查,比如代码风格检查,或者先跑测试。
prepare-commit-msg: 当commit时需要输入message前会触发此hook,可以用此hook来定制自己的default message信息。
commit-msg:当用户输入commit的message后被触发,可以用此hook校验message的信息,比如是否符合规定,有没有cr等。
post-commit:当commit完成后被触发,可以用此hook发送notification等。
pre-rebase: rebase之前会被触发,可以用此hook来拒绝所有的已经push的commits进行rebase操作。
post-merge:当merge成功后,会触发此hook。
pre-push:当push时,remote refs被更新,但是在所有的objects传输前被触发。
pre-auto-gc:当git gc --auto执行前被触发。在垃圾回收之前做一些验证或备份是挺不错的。
ServerSide hooks:
pre-receive:当收到push动作之前会被执行。
update:也是收到push动作之前被执行,但是有可能被执行多次,每个branch一次。
post-receive:当push动作已经完成的时候会被触发,可以用此hook来push notification等,比如发邮件,通知持续构建服务器等。
4.小提示
- 建议地址尽量写全,例如:git push origin master:master 可由 git push 代替
- 更多git相关指令学习可参考 Pro Git