1

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/ \;

terasum
453 声望51 粉丝

Blockchain从业者,Go, JavaScript, Haskell爱好者,函数式编程,高性能并发。