[英]Git pre-receive hook in python to check author time
我在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 log
会使您的git log
或git show
命令比您自己将它们分解成argv单词更复杂:
p = subprocess.Popen(['git', 'log', '-1',
'--date=raw', '--pretty=format:%ad', commit],
stdout=subprocess.PIPE)
例如。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.