Git commit 前检查本地时间是否准确

背景

项目在电脑上运行时经常需要调整本地时间做调试,而提交代码的时候又经常忘记将时间调整回来。这就导致 git 提交时间经常是错乱的,看起来很不爽,也不便于以后查找问题。所以就想能不能在 commit 之前能检查一下电脑本地时间和网络时间是不是一致的呢?如果时间不一致的话就不允许提交

pre-commit

经查找发现 git 中有个叫 pre-commit 的钩子可以在 commit 之前自动执行脚本做一些事情,所以我们的上面的问题就可以解决了。
git 项目根目录下有一个 .git/hooks 文件夹是放置所有钩子脚本的。打开目录我们会发现里面有很多 .sample 后缀的文件,这些都是 git 自带的钩子 demo,都不会执行。想要执行的话需要重命名去掉 .sample 后缀。
本次我们需要的是 pre-commit


开始写代码

工具有了,那接下来就是写脚本检查本地时间是否与网络时间一致了。
由于 pre-commitshell 脚本,解析网络请求时间比较麻烦(其实是我不会),所以检查网络时间部分用简单方便的 python 脚本来实现,然后在 pre-commit 脚本中调用。

检查本地时间与网络时间是否一致

首先是获取准确的网络时间。大型网站的时间都是准确的,而且都可以在请求头 header 中都会得到当前 GMT 时间,我们选择用百度首页,速度很快很稳定。
本地时间好获取,几乎所有语言都有自带的获取方法吧。
检查时间脚本文件 check_localtime_with_net_time.py 如下:

#!/usr/bin/python
# -*- coding: utf-8

import sys
import time
import urllib2

def get_beijing_time_from_web(url):
    response = urllib2.urlopen(url)
    # 获取http头date部分
    ts = response.headers['date']
    # 将日期时间字符转化为time
    gmt_time = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")
    # 将GMT时间转换成北京时间
    long_time = time.mktime(gmt_time) + 8 * 3600
    return long_time


def check_localtime_with_internet(url):
    threshold = 60 # 最大允许 60 秒误差
    net_time = get_beijing_time_from_web(url)
    local_time = time.time()
    if abs(local_time - net_time) <= threshold:
        return 1
    else:
        return 0

if __name__ == '__main__':
    url = 'http://www.baidu.com'
    is_on_time = check_localtime_with_internet(url)
    print is_on_time

钩子 pre-commit 脚本如下

exit 0 以 0 退出表示检查通过,没有问题。
exit 1 以非 0 退出,表示检查有问题,不允许执行 commit

#!/usr/bin/env bash
# 检查本地时间和网络时间是否一致, 不一致的话不让提交, 防止修改本地时间后提交导致提交历史混乱
on_time=$(.git/hooks/check_localtime_with_net_time.py)
if [[ "$on_time" == "1" ]] ; then
    exit 0
fi
echo "本地时间与网络时间不同步, 请先调整下本地时间, 或跳过 pre-commit 检查"
exit 1

都添加可执行权限:
chmod +x check_localtime_with_net_time.py
chmod +x pre-commit

使用

将写好的两个脚本文件 pre-commitcheck_localtime_with_net_time.py 放在 .git/hooks 文件夹下。
好了,现在执行 commit 命令的时候 pre-commit 就会自动执行了。如果本地时间和网络时间不一致(最大允许误差为 60 秒),就会提交失败,提示我们去把本地时间修改正确,时间正常则没有任何反应,完美!


如果不想要检查呢?

长期不想要检查就不要加这俩脚本了,删除文件或重命名 pre-commit 为其他名称都可以。
如果只想某一次不想要检查,那可以在 commit 命令后面添加 –no-verify 参数来跳过检查。


另外

pre-commit 还可以做代码检查之类的操作,比如 eslint。感兴趣的可以自己去查。

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

推荐阅读更多精彩内容