添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

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

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

客户端Hooks

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

提交工作流挂钩

commit 操作有4个挂钩被用来处理提交的过程,它他们的触发时间顺序如下:
pre-commit prepare-commit-msg commit-msg post-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

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

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

#!/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

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工具介绍及使用 ↩︎

这是Git的预提交挂钩,用于检查要提交的代码是否符合Python PEP8样式。 如果检测到样式冲突,该钩子将阻止提交。 安装pycodestyle(正式称为pep8)程序: $ pip install pycodestyle 将预提交另存为your_project / .git / hooks / pre-commit 标记预提交可执行文件: $ chmod +x your_project/.git/hooks/pre-commit钩子可以被覆盖: $ git commit --no-verify 当前,检查以下PEP8代码: E111缩进不是四的倍数E125续行不会将自己与下一条逻辑线区分开E203':'前面的空格E261在线注释前至少两个空格E262内联注释应以“#”开头E301预期为1空行,找到0 E302预期有2条空白行,发现1 E303空行过多(2) E502括号之间的反斜杠是多余的E701一行上有多个语句(冒号) E711与“无”的比较应为“如果cond为无:” W291尾随空格W293空白行包含空格 如果要修改要忽略的
:police_officer: Komit Komit是一个小提示,旨在作为git挂钩运行,以帮助遵循消息标准。 Komit不会妨碍您,而是假设您只需要帮助编写提交的标头部分即可。 它允许git提交之前打开您喜欢的编辑器以更改消息的正文和页脚。 通过同步存储库中的.commitscopesrc文件,它还有助于维护提交范围的一致列表。 安装软件包: npm i -D komit 将钩子添加到package.json中: " husky " : { " hooks " : { " prepare-commit-msg " : " komit $HUSKY_GIT_PARAMS " 使用传统的git钩子安装 添加到.git/hooks/prepare-commit-msg : #! /bin/sh npx komit .git/COMMIT_EDITMSG
git-hydra 这是一个 git post-commit 钩子,它将新提交挑选到另一个分支中,有条件地创建分支并可选地创建一个 PR。 这使得快速开发多个独立功能并将它们拆分为分支和拉取请求变得非常容易。 !重要的! 这个钩子目前不稳定并且高度实验性。 有各种未经测试的边缘情况可能会让你迷失和困惑。 它不会(有意地)运行硬重置或其他可能永久丢失数据的命令。 但尽管如此,请不要使用它,除非您已阅读源代码并且对您的 git 知识感到满意。 reflog 尤其可能派上用场。 这个想法是通过 PR 和代码审查来增加项目的吞吐量。 特别是在 PR 应该很小、重点突出且独立的情况下,审查可能需要一天或更长时间。 在高吞吐量开发中,您可能同时在工作树中处理单独的修复程序和功能,将它们分成自己的分支和拉取请求可能会很痛苦。 总是从“旧”大师那里工作,没有所有仍在审查中的最新修复和改
如果您使用中央存储库管理器,例如 gitolite 或 gitosis,您可能至少有几个使用自定义 git 挂钩的存储库。 CptHook 允许您从一个位置管理所有钩子。 这是一个基本的 cpthook 配置,将单个钩子添加到单个存储库。 我在 /repos/cpthook-admin 下创建了一个 hook.cfg 文件,它是一个存储库,仅用于存储 cpthook 配置和我们希望管理的任何钩子脚本。 [cpthook] 脚本路径 = /repos/cpthook-admin/hooks.d repo-path = /repos [repos apu_repos] members = testrepo hooks = test_hooks [hooks test_hooks] post-commit = test-post-commit.sh 在 hooks.d
GIT提交钩子,用于检查要提交的代码中某些单词/短语/功能的存在。 要安装钩子,请将预提交文件复制到您的项目.git / hooks / pre-commit中: $ cp pre-commit .git / hooks / pre-commit; $ chmod + x .git / hooks / pre-commit; 该钩子带有“ die”,“ print_r”和“ var_dump”功能,作为提交之前要检查的字符串。 如果需要,可以通过修改checks数组来添加更多要检查的字符串 如有任何错误,请访问:
git log命令主要用于查看Git版本演变历史(也就是提交历史),同时根据追加的参数和选项不同,也会有不同的展示效果。 但默认git log命令显示出的x效果实在太丑,不好好打扮一下根本没法见人,打扮好了用alias命令拍个照片,就正式出道了! 1、git log命令说明 git log用于查询版本的历史,命令形式如下: fsharp git log [<options>] [<since>..<until>] [[--] <path>...]
设置Git钩子 我们在本地把开发好的项目文件push到服务器时,只是提交到了创建的Git服务器创建的裸仓库中。还需要进入服务器的web运行目录,通过git pull命令拉取到web目录。从本地仓库git push项目到远程仓库,让push到远程仓库中的项目能在web目录运行起来,还需要web目录进行pull拉取下。push一次就需要pull一下,操作起来很繁琐,相当不方便。为了解决这个问题就可以使用Git中的钩子来解决该问题。 上一节课咱们已经搭建了Git服务器,并创建了/usr/local/gitdata
获取最后一次commit时间 git show --pretty=format:"%ci %cr" | head -1 2021-04-07 15:06:17 +0800 2 hours ago 获取最后一次提交commit Id git rev-parse HEAD 31cab83b6cc7b844dc407291d47ac72f1d495690 获取最后一次提交的short commit Id git rev-parse --short HEAD 31cab83b6
如何修改Git提交记录 因为错误,补充或说明格式等问题,有时需要修改已执行的Git提交记录。这个操作并不常用,很多人并不清楚如何操作,所以特意写了本博客进行详细说明。 开始前先学一个英文单词: amend /əˈmend/ vt. 修改;改善,改进; vi. 改正,改善;改过自新 The seller will request to amend the letter of credit. ...