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

  近期公司开发使用的版本控制工具由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 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://my.oschina.net/u/4000302/blog/3033697

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话的意思是:husky > pre-commit hook 失败了(添加 --no-verify 来绕过)。 其中,husky 是一个 Git 钩子管理工具,pre-commit hook 是其中的一个钩子,用于在提交代码前执行一些操作,比如代码格式化、代码检查等。如果 pre-commit hook 失败了,就会出现这个提示。 提示中提到了一个 --no-verify 参数,可以用来绕过 pre-commit hook 的检查。但是,这并不是一个好的做法,因为 pre-commit hook 的目的就是为了保证代码的质量和规范性,绕过它可能会导致代码质量下降。所以,我们应该尽量避免使用 --no-verify 参数,而是要修复 pre-commit hook 的问题。 ### 回答2: 此问题涉及到git中的pre-commit钩子(hook),可以通过加入--no-verify命令来绕过验证。 在git中,pre-commit钩子是用于在代码提交前运行脚本的钩子。它用于在代码提交之前进行某些操作,如代码规范检查、语法检查和单元测试。如果pre-commit钩子在运行期间发现问题,则会防止代码提交。 然而,在某些情况下,因为某些原因,pre-commit钩子可能会失败。当您尝试提交代码时,您可能会看到如下错误消息:“husky > pre-commit hook failed (add --no-verify to bypass)”。 在这种情况下,可以使用--no-verify命令来绕过这个问题,如下所示: ``` git commit --no-verify -m "commit message" ``` 这将绕过pre-commit钩子并执行提交。但是请注意,这只会在特殊情况下使用,如果pre-commit钩子出现问题,最好不要轻易绕过它,而是需检查并解决问题。 解决pre-commit hook失败通常需要检查pre-commit脚本中的代码以确定具体错误,例如检查代码中的错误、语法错误等等。通过解决这些问题,可以解决pre-commit hook失败的问题。 总之,当您在git中遇到husky > pre-commit hook failed (add --no-verify to bypass)问题时,您可以使用--no-verify命令来绕过它,但是最好的解决方法是检查并解决pre-commit脚本中的问题。 ### 回答3: 这个问题通常发生在使用git管理代码时出现的错误,可能有几种情况导致这个错误的出现。首先,Husky是一个流行的Git Hook库,它能够在Git操作的不同阶段自动运行脚本。这个错误通常涉及到Husky的“pre-commit hook”,也就是在提交代码前验证代码质量的钩子。 什么是Git钩子? Git钩子是一些自动运行的脚本,它们被设置在特定的Git事件上,例如提交代码、合并代码等。Git钩子路径存放在.git/hooks目录下,你可以在这个目录下查看和编辑所有可用的Git钩子。 原因一:Husky pre-commit hook 校验失败 当你将代码提交Git仓库的时候,Husky pre-commit hook 会自动运行验证脚本来保证代码的质量。如果这些验证脚本出现了问题,Husky会报错并禁止提交代码,出现“husky > pre-commit hook failed”这个错误。这时需要检查校验代码的脚本是否有问题,例如是否有语法错误或者程序错误等。 原因二:Git 钩子脚本出现错误 除了Husky pre-commit hook校验失败之外,还有可能是Git钩子脚本出现了错误。例如,某些开发者可能会自己编写Git钩子脚本,如果这个脚本出现了问题,就会导致上述错误的出现。这时,需要检查Git钩子脚本的路径是否正确、脚本是否有语法错误或程序错误等。 如何解决 为了解决这个错误,你可以使用”–no-verify”参数来绕过Git钩子的校验。但这并不是一个好的解决方案,因为这意味着你无法保证你提交的代码符合你自己或你团队的代码质量标准。正确的解决方案是修复你的Husky pre-commit hook验证脚本或者Git钩子脚本错误,并再次尝试提交提交你的代码。如果你不确定如何修复这些错误,可以向你的团队或社区寻求帮助。如果你遇到了严重的错误,你可能需要卸载和重新安装Husky。 总之,当你遇到“husky > pre-commit hook failed”这个错误时,你应该在修复验证脚本或Git钩子脚本之后再次尝试提交你的代码,而不是仅仅“绕过”钩子的校验。这将帮助你加强你的代码质量和保持团队的开发标准。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值