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