运用Git钩子自动更改最后一次Commit的提交时间

5 篇文章 0 订阅

需求背景

有些时候希望按照规则的时间提交commit信息,比如强迫症可能希望每一次commit的时间都是整数时间、比如本地时间不准确,希望按照网络时间来提交1、还有一些其他的原因。。

但是Git默认是按照本地的时间来提交commit信息,当然自由的Git有方法可以自定义提交的时间:

SET GIT_COMMITTER_DATE=%C_TIME% && git commit --amend --no-edit --date=%A_TIME%

需要注意可以设定的时间分为Author DateCommitter Date2。手动修改当然可以,但是每次修改岂不麻烦?要是有一次忘记了,后面还要rebase,那就麻烦大了。

久闻Git有的钩子(hook)功能,可以辅助完成各种自动化的操作,学习了一下钩子实现了自动切换commit到指定时间的方法。

客户端Hooks

Git的客户端钩子只影响它们所在的本地仓库。客户端挂钩主要分为几种类型3:提交工作流挂钩、电子邮件工作流挂钩、以及其他客户端挂钩。

提交工作流挂钩

commit操作有4个挂钩被用来处理提交的过程,它他们的触发时间顺序如下:
pre-commitprepare-commit-msgcommit-msgpost-commit

post-commit

post-commit 挂钩在整个提交过程完成后运行,它不会接收任何参数,但可以很简单地运行git log来获得最后的提交信息。

打开~\.git\hooks目录,创建post-commit文件(注意没有后缀名),内容如下:

#!/usr/bin/env python

import os
import time

popen = lambda cmd: os.popen(cmd).read()
show = lambda stamp: time.strftime('%Y-%m-%d %H:%M:%S (%a)', time.localtime(stamp))

def convert(stamp):
    day = time.localtime(stamp)
    wday = day.tm_wday
    monday = time.mktime(day[:3] + (0,) * 6) - 86400 * wday
    if wday < 5:
        return monday - 86400 * 2 + (stamp - monday) * 0.4
    return stamp

def amend(at=None, ct=None):
    cmd_ct = 'set GIT_COMMITTER_DATE=%s && ' % ct if ct else ''
    cmd_at = ' --date=%s' % at if at else ''
    cmd = cmd_ct + 'git commit --amend --no-edit' + cmd_at if (at or ct) else ''
    popen(cmd)

at1 = int(popen('git log -1 --format=%at'))
ct1 = int(popen('git log -1 --format=%ct'))
at2 = convert(at1)

if not at2 == at1 == ct1:
    amend(at2, at2)

一个简单的脚本实现commit之后,根据git log获取最后一次提交时间,在convert函数中对时间戳进行转换,然后再次提交一次commit --amend,修改最后一次提交的时间。

本例中将周一到周五的时间映射到了周末,这样所有工作日的提交就会自动变更记录为周末的提交时间(注意如果遇到节假日的调班就不行了哦)。

如果只是希望提交日期作者日期对齐的话,可以不用调用Python,用git自身支持的bash就可以完成:

#!/bin/sh
export GIT_COMMITTER_DATE=$(git log -1 --format=%at)
if [ $GIT_COMMITTER_DATE != $(git log -1 --format=%ct) ]; then
    git commit --amend --no-edit
fi

需要注意的是,赋值和判断语句附近的空格都不能去掉,否则会有语法错误。

或者还可以用数组赋值的方法:

#!/bin/sh
t=($(git log -1 --format="%at %ct"))
if [ ${t[0]} != ${t[1]} ]; then
    GIT_COMMITTER_DATE=${t[0]} git commit --amend --no-edit
fi

注意事项

1、修改提交时间的本质是在commit命令之后再次运行一次commit --amend,所以在引用记录里仍然能够看到所有的操作。如果有方法能够将这一步也能避免,这是值得改进的;

2、commit --amend本身实际上也是一次commit,所以在这次commit之后会再次触发post-commit挂钩。所以需要设计合理的逻辑让amend之后的提交不再符合post-commit脚本里的规则,不会再次进行commit --amend提交,否则可能产生递归。当然,除非递归本身就是你预期的效果。


  1. 基于Python开发pre-commit hook达到对Git提交时间的控制 ↩︎

  2. 为什么git AuthorDate与CommitDate不同? ↩︎

  3. GitHook工具介绍及使用 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,你可以使用 Git 提交钩子自动添加 Change-Id,或手动添加它。下面是两种方法: 1. 自动添加 Change-Id:你可以使用 Git 提交钩子自动添加 Change-Id。Git 提交钩子是一些自定义脚本,可以在 Git 操作期间触发。你可以创建一个提交钩子脚本,使其在每次提交自动添加 Change-Id。这样,你就不必手动添加 Change-Id 了。这里是一个示例提交钩子脚本: ``` #!/bin/sh commit_msg_file=$1 commit_msg=$(cat $commit_msg_file) if ! grep -q "^Change-Id:" $commit_msg_file; then change_id=$(uuidgen) echo "Change-Id: $change_id" >> $commit_msg_file fi ``` 将该脚本保存为 `commit-msg` 文件,并将其放置在 `.git/hooks` 目录下。确保该文件具有执行权限。现在每次提交时,Git自动为你添加 Change-Id。 2. 手动添加 Change-Id:如果你不想使用提交钩子自动添加 Change-Id,你可以手动添加它。要手动添加 Change-Id,请按照以下步骤操作: a. 生成一个唯一的 Change-Id:你可以使用任何工具来生成一个唯一的字符串。例如,你可以使用 `uuidgen` 命令来生成一个 UUID。保存生成的字符串。 b. 将 Change-Id 添加到提交信息中:在提交信息的末尾添加一行 `Change-Id: <change-id>`,其中 `<change-id>` 是你在第一步中生成的唯一字符串。 c. 保存提交信息并提交:保存提交信息并使用 `git commit` 命令提交更改。现在你的提交应该包含一个有效的 Change-Id。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值