用python中的Git prereceive钩子检查作者tim

2024-04-25 18:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了一个pre-receive钩子,以确保作者日期不晚于服务器日期,代码如下:

import datetime, sys, subprocess

def validate_author_date(commit):
    p = subprocess.Popen(['git show --pretty=format:"%at"', commit],
    shell=True, stdout=subprocess.PIPE)
    x = p.stdout.readline()
    if x.strip():
        ad = datetime.date.fromtimestamp(int(x))
        return ad <= datetime.date.today()
    else:
        return False

for line in sys.stdin:
    (base, commit, ref) = line.strip().split()
    if not validate_author_date(commit):
        sys.exit('Date error: commit date is later than sys date. commit hash is %s' % commit)

问题是:假设服务器时间是2015-3-23,我推一个日期为2015-3-25的提交,钩子并没有像预期的那样工作。在


在编辑:一些背景信息,我们的程序中有很多计时器,我的同事为了调试目的更改了他们的系统时间,而在提交更改时忘记了更改时间。我只想编写一个钩子来检测这种情况,并在将来的时间内拒绝提交。在


Tags: 服务器datetimedatereturnifstdoutsys时间
1条回答
网友
1楼 · 发布于 2024-04-25 18:22:11

你需要更具体地说明你的期望和你所观察到的;但我想我知道问题出在哪里。在

请看以下内容:

$ git cat-file -p HEAD
tree afd02e8830a8d41398d0d77983ae7783e0382b39
parent 46d403f13e5cb6d2b6bee6f942a679ea8978b9fa
author Junio C Hamano <gitster@pobox.com> 1426883513 -0700
committer Junio C Hamano <gitster@pobox.com> 1426884806 -0700

Post 2.3 cycle (batch #11)

Signed-off-by: Junio C Hamano <gitster@pobox.com>

注意,作者和提交者日期的末尾都有这个额外的-0700。现在:

^{pr2}$

如果您只使用%at,您将得到原始时间,而不使用-0700时区加法。使用 date=raw pretty=format:%ad来获得两者,然后应用偏移量(注意,偏移量是小时和分钟的偏移量,因此对于那些奇怪的3小时30分钟时区,您将得到类似于-0330)的内容。在

(我还建议避免shell=True这里,这只会使您的git log或{}命令比您自己将它们分解成argv单词更复杂:

p = subprocess.Popen(['git', 'log', '-1',
    ' date=raw', ' pretty=format:%ad', commit],
    stdout=subprocess.PIPE)

例如。)

相关问题 更多 >