基于python开发pre-commit hook达到对git提交时间的控制

这一生的挚爱 提交于 2019-12-05 05:36:27

  近期公司开发使用的版本控制工具由svn转向git,由于开发需求,经常会更改本地的时间,从而暴漏出一个原先使用svn不会出现的问题:commit的时间经常会不对。主要是因为git提交到远程服务器需要两部曲commit-push,而commit时使用的是本地的系统时间,这样就导致在修改本地时间之后,commit的时间就与正常时间对不上。现在希望开发一个脚本实现在提交的时候检查本地的时间是否正常,如果异常就阻止此次提交,以此来控制提交时间。 
  在定位好问题之后,确定使用git中pre-commit这个hook达到本地提交的时候检查本地时间的目的。由于hook支持python,我对python又比较熟,所以决定使用python实现。 
  确定好以上问题之后,需要解决的问题是如何获取到远程服务器的时间。由于公司统一在内网开发,所以开发机是无法连接到外网的,所以是无法直接获取到外网的时间,于是考虑在内网搭建一台ntp服务器。搭建服务器的教程参考:http://www.cnblogs.com/kerrycode/archive/2015/08/20/4744804.html。搭建完ntp服务器后,编写了第一版程序:

#!/usr/bin/env python
#coding=utf-8

import time
import ntplib
import sys
import math

max_diff = 20 * 60          #  最大允许相差20分钟
url = "time.windows.com" # 获取时间的ntp服务器

def STD(s_time):
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s_time))


def get_server_time():
    try:
        client = ntplib.NTPClient()
        return client.request('time.windows.com').tx_time
    except:
        return  -1

def judge_commit_time():
    now = time.time()
    server_time =  get_server_time()
    if (server_time <= 0):
        print "远程服务器不可用,请确认当前系统时间!"
        sys.exit(0)
    elif (math.fabs(now - server_time) > max_diff):
        print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相差太远,无法提交!")
        sys.exit(1)  # 返回1,代表无法成功提交
    else:
        print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相近, 可以提交!")
        sys.exit(0)

judge_commit_time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  本地简单的进行了测试,是ok的。当将该程序共享给小伙伴的时候出现问题了,大家都没有ntplib这个库。所以只好只使用python的基础库重写。。。。 
  由于搭建ntp的服务器提供nginx服务,于是就想到写了简单的网页输出系统时间,在nginx配置一个端口指向这个网页,然后在python中直接curl该网页。网页如下:

<script type="text/javascript">
    var date = new Date();
    document.write(Date.parse(date));
</script>
1
2
3
4
  nginx配置如下:

 server {
     listen 30303;
     server_name localhost;

    location / {
        root `path`; # 网页所在的路径
        index index.html
    }
    .....
    .....
 }
1
2
3
4
5
6
7
8
9
10
11
  当我妄图通过urllib.urlopen(url)获取到时间的时候傻眼了,直接获取到的是网页的源码,也就是script那一段,我不需要啊!!!!正在我百愁莫展之际,我突然发现,urllib的返回是携带时间信息的,这给了我灵感,我就直接取返回的网页中携带的时间信息当做远程服务器的时间,经过修改后的代码如下: 
  

#!/usr/bin/env python
#coding=utf-8

import time
import urllib
import sys
import math

max_diff = 20 * 60          #  最大允许相差20分钟
url = "http://www.baidu.com" # 获取时间的ntp服务器

def STD(s_time):
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s_time))

def DTS(d_time):
    gmt_time = time.mktime(time.strptime(d_time, "%a, %d %b %Y %H:%M:%S GMT")) # 返回的时间是GMT时间,需要转化为UTC8的时间
    utc8_time = gmt_time + 8 * 60 * 60
    return utc8_time

def get_server_time():
    try:
        page = urllib.urlopen(url)
        stime = float(DTS(page.headers.dict.get("date")))
        return stime
    except:
        return  -1

def judge_commit_time():
    now = time.time()
    server_time =  get_server_time()
    if (server_time <= 0):
        print "远程服务器不可用,请确认当前系统时间!"
        sys.exit(0)
    elif (math.fabs(now - server_time) > max_diff):
        print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相差太远,无法提交!")
        sys.exit(1)  # 返回1,代表无法成功提交
    else:
        print ("远程服务器时间: " + STD(server_time) + " 与 本地时间: " + STD(now) + " 相近, 可以提交!")
        sys.exit(0)

judge_commit_time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  经过投机取巧,终于解决了,各位如果有什么更好的想法,欢迎留言讨论!


--------------------- 
作者:青竹梦 
来源:CSDN 
原文:https://blog.csdn.net/rowanhaoa/article/details/52818637 
版权声明:本文为博主原创文章,转载请附上博文链接!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!