Git Hook

git hook 通过在代码commit和push之前执行一个脚本,来实现一些检查性工作😎。

在.git/hooks目录下的脚本文件,默认情况下该目录下有以下文件

applypatch-msg.sample

commit-msg:sample

pre-applypatch.sample

pre-commit.sample

pre-push.sample

pre-rebase.sample

prepare-commit-msg.sample


update.sample

pre-receive.sample

post-update:sample

分割线前面几种是客户端钩子,后面几种是服务端钩子

pre-receive可以用来在服务端设置一些代码检查的功能,通过它可以拒绝一些不满足条件的push,无情的推行代

码检查。

post-receive它发生在push代码之后,可以通过CI来触发一些测试代码。

若要相应的钩子生效,编辑脚本文件的内容,去掉.sample后缀即可。脚本若返回非0值,则相应的git操作不再

往后执行。

通过pre-push来举个🌰

现在我想在每次push文件之时,检查项目中有没有重复图片,来减少不必要的包体积。假设检查重复图片的

脚本叫做duplicate_image_detector.py

现在通过客户端钩子来实现,因为./.git/hooks下的文件是无法通过git来进行管理,所以只能在客户端自己将

hook脚本拷贝在./.git/hoos目录下了,hook脚本本身可以通过git来管理。

hook脚本如下:

#!/bin/bash
# 图片检测
if [ ! -f "./Checkers/duplicate_image_detector.py" ]; then
  echo "未集成图片检测脚本"
  exit 1
fi

如果有多个任务需要处理,下一个任务需要在上一个任务成功之后再执行,则需要通过:

$? -eq 0

条件来判断上个任务是否以0结束,以0结束表示执行成功,反之返回非0就代表任务结束,不再继续执行了,整

体类似:

#前置任务
#./abc/xyz/xx.rb

if [ $? -eq 0 ]; then
    echo "***********xx.rb检测脚本通过****************"
else
    echo "***********xx.rb检测脚本未通过****************"
    exit 1
fi

# 图片检测
if [ ! -f "./Checkers/duplicate_image_detector.py" ]; then
  echo "未集成图片检测脚本"
  exit 1
fi

如果为了进一步方便,再写一个脚本来检查当前环境是否准备好了hook脚本,并进行本地部署:

#!/bin/bash

if ![-f ./shell/pre-push]; then
    echo "没有找到hook的脚本文件"
    exit(1)
fi

if [-f ./.git/hooks/pre-push.sample]; then
    rm ./.git/hooks/pre-push.sample
fi

cp  ./shell/pre-push ./.git/hooks/pre-push

echo "hook设置成功"

每次有新人就让他手动调用一下这个脚本,最好的方式是希望能够将.git/hooks/下的脚本纳入git管理。暂时没有找到解决方案😫,或者部署在服务端,但是需要管理员权限。

针对于上述问题,最后在同事提示下找到一个替换的方案。在Xcode的Build Phases中添加一个"Run Script"功能,在Xcode每次编译的时候都会执行这个脚本。

首先setupHook.sh需要修改一下:

#!/bin/bash

if [ -f ./shell/pre-push ]; then
    echo "hook文件存在"
else
    echo "hook文件不存在"
    exit 1
fi

if [ -f ./.git/hooks/pre-push.sample ]; then
    rm ./.git/hooks/pre-push.sample
fi

if [ -f ./.git/hooks/pre-push ]; then
    echo "hook已经设置过"
else
    echo "hook未设置,开始设置"
    cp  ./shell/pre-push ./.git/hooks/pre-push
    echo "hook设置成功"
fi

然后再将setupHook.sh脚本添加进去如下所示:

Run Script

还需要修改一下脚本执行权限,在cmd中执行:

chmod u+x setupHook.sh

再Build一下,最后会看到如下输出:

log

就说明设置生效了。

这样一来,就不用太担心某个同学因为忘记设置hook脚本而提交代码没有触发脚本的问题了,因为提交代码之前不太可能不会Build代码,但是还是需要在README中显示的提醒一下,最后一步只是以防万一。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容