(三) git pre-push hook 实践一二

  在 (一) 初探 iOS 单元测试 一文中,咱们简单提到了执行xcodebuild test能够启动工程的单元测试并输出测试结果,但手动执行此类命令意义是不大的。咱们须要的是,把一些测试和lint等命令写在脚本文件里,在代码提交、合并及打包等行为实际发生前,自动执行脚本,以执行的结果决定是否打断上述操做,必定程度上达到控制代码质量的目的。   在多人协做开发中,咱们能够在全部成员进行某些git操做(commit push merge rebase等)前进行代码的验证(Test、Lint等),防止逻辑错误或不合规范的代码更新到远端仓库中。固然,若是团队搭建了本身的git服务器,有Mac服务器,在server端进行git hooks是最好的解决方案,本地仓库也不用进行额外配置。此外,咱们也能够作一些Client Hooks,来达到一样的效果。如下内容是笔者对git pre-push hook的一些实践。git

手动添加pre-push文件

前往本地仓库,按下command+shift+.查看隐藏文件,目录以下。咱们能够看到.git/hooks路径下有一些.sample的文件。 xcode

.git/hooks
删除pre-push.sample文件的后缀名,用编辑器打开,写入:

exit 1
复制代码

保存退出,仓库根目录下,执行:bash

git push
复制代码

push log
能够看到push失败。下面咱们在pre-push写入单元测试的命令,若是测试经过,pre-push程序正常退出,push成功;测试失败,出错并退出,push失败。写入:

workspace_name() {
  workspace_file=`find . -maxdepth 2 -name *.xcworkspace -exec basename {} \;`
  echo ${workspace_file%.xcworkspace}
}

check_result() {
if [ $? != 0 ]; then
echo "$1 failed!!"
echo "push will not execute"
echo "$?"
exit 1
else
echo "$1 passed."
echo "push will execute"
echo "$?"
fi
}

workspace=$(workspace_name)

xcodebuild -workspace Example/$workspace.xcworkspace -scheme $workspace-Example -destination 'platform=iOS Simulator,OS=11.0,name=iPhone 7' test
check_result "test"
复制代码

例子是以pod lib create ...建立的标准工做空间,从仓库根目录起以最大深度为2寻找以.xcworkspace结尾的文件名,赋给workspace变量,最后test名为worksapce.xcworkspace scheme为worksapce-Example的工程,测试失败,打印"push will not execute"exit 1;反之打印push will executeexit 0。 仓库根目录下执行:服务器

git push
复制代码

最后输出: markdown

测试失败,push失败
测试经过,push成功
如今咱们已经实现了一些咱们想要的效果,但如何让团队里的每一个开发成员都收到pre-push hook的规范呢?

自动添加pre-push文件

咱们知道,.git文件夹并不会被push到远程仓库,每一个成员clone仓库,.git文件夹是会初始化的。也就是说,正常状况下,pre-push hook只对我的有效。但咱们能够耍一些小手段,让每一个成员仓库.git/hooks路径下都存在咱们写好的pre-push文件,这样其余成员的仓库也具有了git pre-push hook功能。app

if [ ! -d "$../.git/hooks/pre-push" ]; then
cp ../pre-push ../.git/hooks/pre-push
exit 0
fi
复制代码

首先,咱们写好一个脚本,功能为若是.git/hooks路径下没有pre-push文件,就复制一个进去。如图中add-pre-push-hook.sh文件: 编辑器

add-pre-push-hook.sh
那这个脚本在何时被执行呢?答案是放在咱们Target的Run Script下:
Run Script
  注意Run Script 和 add-pre-push-hook.sh 是在.xcodeproj的路径下开始执行的。这样,每当build,就会执行add-pre-push-hook.sh检查.git/hooks文件夹下是否存在pre-push文件并尝试复制进去。下次当开发成员尝试push代码时,便无形中受到了hook!!!这一切对不少工程的基础库的维护作代码检查仍是有必定实用价值的。

谢谢观看!欢迎指出文中错误!

参考文档

git-scm.com/book/en/v2/… blog.ittybittyapps.com/blog/2013/0… blog.ricardofilipe.com/post/git-ho…oop

相关文章
相关标签/搜索