python中的Git预接收挂钩,用于检查作者时间



我在python中编写了一个预接收挂钩,以确保作者日期不晚于服务器日期,下面是代码:

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的提交,钩子没有按预期工作。


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

您需要更具体地了解您的期望和观察到的内容;但我想我知道问题出在哪里。

看看以下内容:

$ 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。现在:

git log -1 --pretty=format:%ad HEAD
Fri Mar 20 13:31:53 2015 -0700
$ git log -1 --pretty=format:%at HEAD
1426883513
$ git log -1 --date=raw --pretty=format:%ad HEAD
1426883513 -0700
$ 

如果您只使用%at,您将获得原始时间,而不添加-0700时区。使用--date=raw --pretty=format:%ad同时获得这两个值,然后应用偏移量(注意,这是一个小时和分钟的偏移量,所以对于那些奇怪的3小时和30分钟的时区,你会得到类似-0330的值)。

(我也建议在这里避免使用shell=True,这只会使您的git loggit show命令比您自己简单地将它们分解为argv单词更复杂:

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

例如。)

最新更新