Git hooks 是git很是好用的一个特性,在我本身的项目中,我须要保证个人全部go源文件都可以被正确地格式化,而后才可以被commit。所以,我用了一个很简单的git hook完成这项工做,你能够把这个文件的内容保存到.git/hooks/pre-commit
来实现这个功能。git
对我我的而言,这样的工做已经足够,可是我想把这个好主意分享给个人小伙伴们。这篇Stack Overflow 文章给了我一些灵感,我在这里进行一些扩展。github
因为.git
文件夹是不会被git跟踪的,所以咱们须要在根目录建立一个.githooks
来存储咱们的hooks脚本。你能够选择任意的文件夹名,只要可以work便可。记住全部的hooks须要可执行权限,因此须要保证全部的hook脚本都执行过chmod +x
命令,不然,脚本将不会工做。golang
若是你的 Git版本为Version 2.9或者更高,你能够简单地经过设置core.hooksPath
配置项来实现你的功能:bash
$ git config core.hooksPath .githooks
若是你在使用低版本的Git,你能够经过符号连接实现上述功能,你能够经过这个命令实现git的重定向:code
$ find .git/hooks -type l -exec rm {} \; && find .githooks -type f -exec ln -sf ../../{} .git/hooks/ \;
虽然hooks一般是本地脚本,可是在共享的时候,一般须要确保团队的成员都可以将hooks放置在合适的位置,而且可以正常地工做。特别是在他们每次作了新的checkout的时候,所以我把个人脚本放在了Makefile
中,在每次个人项目初始化的时候自动去执行,下面是个人两个任务:ip
init: git config core.hooksPath .githooks
earlier version:get
init: find .git/hooks -type l -exec rm {} \; find .githooks -type f -exec ln -sf ../../{} .git/hooks/ \;