网站开发外包计入什么科目,怎样申请网站空间,查看网站名称,网站可以做多语言的吗介绍
当我们在执行git管理仓库代码时#xff0c;想规范下每个用户的commit内容#xff1f;想检查下提交的代码规范#xff1f;想检查下PR是否通过#xff0c;那么这个时候就需要用到git hooks#xff0c;git hooks可以在我们进行git操作的关键时机插入我们想要执行的“脚…介绍
当我们在执行git管理仓库代码时想规范下每个用户的commit内容想检查下提交的代码规范想检查下PR是否通过那么这个时候就需要用到git hooksgit hooks可以在我们进行git操作的关键时机插入我们想要执行的“脚本文件”。
git的hooks按照环境分客户端侧client-side和服务端侧server-side。客户端侧的hook主要用于提交git commit和合并merge命令而服务端侧的hook主要用于接收push等操作。
git的hooks是有本地执行的脚本语言写成的默认时Shell Script当然也可以是Ruby、Python等。
客户端的hooks
每一个Git repo下都有一个.git/hooks的目录本地和远程均有通常不加入到git管理其内容就是放置hooks的位置。我们自定义hook的话就是放置在这个目录下当我们在本地触发git操作时相应的hook就会被执行。
客户端 git hooks 全貌 客户端 hooks 分类git hooksgit hooks 执行时机commit hooksgit commit触发pre-commitgit commit执行前commit-msggit commit 执行前prepare-commit-msggit commit 执行后编辑器打开前post-commitgit commit 执行后e-mail hooksgit am触发applypatch-msggit am 执行前pre-applypatchgit am 执行前post-applypatchgit am 执行后其他 hookspre-rebase git rebase 命令之前 post-checkout git checkout 、git clone均可触发在工作区更新之后执行post-merge git merge 调用在merge成功后执行
commit hooks *pre-commit pre-commit是最先触发运行的脚本。在提交一个commit之前该hook有能力做许多工作比如检查待提交东西的快照以确保这份提交中没有缺少什么东西、文件名是否符合规范、是否对这份提交进行了测试、代码风格是否符合团队要求等等。 这个脚本可以通过传递--no-verify参数而禁用如果脚本运行失败返回非零值git提交就会被终止。 *commit-msg commit-msg包含有一个参数用来规定提交说明文件的路径。 该脚本可以用来验证提交说明的规范性如果作者写的提交说明不符合指定路径文件中的规范提交就会被终止。 该脚本可以通过传递–no-verify参数而禁用如果脚本运行失败返回非零值git提交就会被终止。 *prepare-commit-msg prepare-commit-msg脚本会在默认的提交信息准备完成后但编辑器尚未启动之前运行。 这个脚本的作用是用来编辑commit的默认提交说明。 该脚本有1~3个参数包含提交说明文件的路径commit类型message, template, merge, squash一个用于commit的SHA1值。这个脚本用的机会不是太多主要是用于能自动生成commit message的情况。 该不会因为--no-verify参数而禁用如果脚本运行失败返回非零值git提交就会被终止。 *post-commit post-commit脚本发生在整个提交过程完成之后。这个脚本不包含任何参数也不会影响commit的运行结果可以用于发送new commit通知。
e-mail hooks
*applypatch-msg applypatch-msg脚本最先被触发它包含一个参数用来规定提交说明文件的路径。该脚本可以修改文件中保存的提交说明以便规范提交说明以符合项目标准。如果提交说明不符合规定的标准脚本返回非零值git终止提交。
说明一点这个脚本看上去和commit-msg作用几乎一样。没错默认情况下该脚本是这样写的 ![[Pasted image 20240111191843.png]] 也就是说该脚本会调用commit-msg并执行。实际上这一切都是可修改的。
pre-applypatch pre-applypatch会在补丁应用后但尚未提交前运行。这个脚本没有参数可以用于对应用补丁后的工作区进行测试或对git tree进行检查。如果不能通过测试或检查脚本返回非零值git终止提交。 同样需要注意git提供的此默认脚本中只是简单调用了pre-commit因此在实际工作中需要视情况修改。
post-applypatch post-applypatch脚本会在补丁应用并提交之后运行它不包含参数也不会影响git am的运行结果。该脚本可以用来向工作组成员或补丁作者发送通知。
其他hooks
pre-rebase 由git rebase命令调用运行在rebase执行之前可以用来阻止任何已发发生过的提交参与变基字面意思找不到合适的词汇了。默认的pre-rebase确实是这么做的不过脚本中的next是根据Git项目自身而写的分支名在使用过程中应该将其改成自己的稳定分支名称。
post-checkout 由git checkout命令调用在完成工作区更新之后执行。该脚本由三个参数之前HEAD指向的引用新的HEAD指向的引用一个用于标识此次检出是否是分支检出的值0表示文件检出1表示分支检出。 也可以被git clone触发调用除非在克隆时使用参数–no-checkout。在由clone调用执行时三个参数分别为null, 1, 1。 这个脚本可以用于为自己的项目设置合适的工作区比如自动生成文档、移动一些大型二进制文件等也可以用于检查版本库的有效性。
post-merge 由git merge调用在merge成功后执行。该脚本有一个参数标识合并是否为压缩合并。该脚本可以用于对一些Git无法记录的数据的恢复比如文件权限、属主、ACL等。
服务端 hooks
除了本地执行的Hooks脚本之外还有一些放在Git Server上的Hooks脚本作为管理员可以利用这些服务端的脚本来强制确保项目的任何规范。这些运行在服务端的脚本会在push命令发生的前后执行。pre系列的脚本可以在任何时候返回非零值来终止某次push并向push方返回一个错误说明。
hook 名说明pre-receivegit-receive-pack 执行前post-receivegit receive-pack执行后updategit receive-pack执行后
pre-receive 由服务器端的git receive-pack命令调用当从本地版本库完成一个推送之后远端服务器开始批量更新之前该脚本被触发执行。该脚本会从标准输入中读入一连串push过来的引用如果这里面存在任何非零值这批更新将不会被服务器接受。可以利用这个脚本来检查推送过来的提交是否合法。
post-receive 由服务器端的gir receive-pack命令调用当从本地版本库完成一个推送并且在远程服务器上所有引用都更新完毕后执行。该脚本可以用于对其他镜像版本库的更新或向用户发送提示直接通过服务器端的echo命令。如上文我提到的利用Git实现生产代码的自动化部署就可以通过这个脚本完成。
update 这是一个强大的hook脚本。它和pre-recieve有些类似只是它会为推送过来的更新中涉及到的每一个分支都做一次检查而后者则至始至终只有一次检查。另外它不是从标准输入中读取数据而是包含三个参数
要更新的引用或分支的名称引用中保存的旧对象名称SHA1将要保存到引用中的新对象名称(SHA1) 如果检查到返回非零值之后返回非零值的引用会被拒绝其他正常的引用更新都会被接受。除此之外该脚本还可以用来防止引用被强制更新因为它可以通过这些参数来检查新旧引用对象中是否存在继承关系从而提供更细致的推送授权。
参考资料
git hooks官网