• 通过TortoiseGit钩子实现提交前检查作者信息是否正确


    1、需求背景

    从事嵌入式开发的人运行软件依赖于特定的电脑硬件,可能会存在多人在同一台电脑上开发的需求。

    我们使用git进行软件代码版本管理,通过提交时的用户名和邮箱区分某次代码是哪个人提交的信息。git自身支持提交的时临时一次设置成其他的用户信息,但是需要单独命令配置,难免偶尔会忘记。

    为了避免疏忽引起提交错误的用户信息,我利用TortoiseGit的钩子功能,在提交代码前触发弹出用户交互界面,引导用户选择或设定正确的账户信息,并根据选择情况修改git仓库配置,随后提交的代码即会按照新的信息记录。

    2、实现方法

    2.1、环境要求

    安装git、TortoiseGit、Python。

    2.2、Python获取最近提交者信息列表

    工程根目录下直接新建confirm.py文件,编辑内容如下:

    import re
    import sys
    import subprocess
    import tkinter as tk
    from tkinter import ttk
    from tkinter.messagebox import showerror
    
    
    def popen(args):
        p = subprocess.Popen(args, -1, None, -1, -1, -1, encoding='u8')
        return p.stdout.read().strip()
    
    
    def verify():
        mail = var.get().strip()
        m = re.fullmatch('(.+)<(.+@.+)>', mail)
        if not m:
            return showerror('Error', 'Mail format should like "张三 "')
        top.destroy()
        popen('git config --local user.name  "%s"' % m.group(1).strip())
        popen('git config --local user.email "%s"' % m.group(2).strip())
    
    
    def history(n):
        name = popen('git config user.name')
        mail = popen('git config user.email')
        mails = ['%s <%s>' % (name, mail)]
        for mail in popen('git log -%d --format="%%an <%%ae>"' % n).splitlines():
            if mail not in mails:
                mails.append(mail)
        return mails
    
    
    mails = history(20)
    
    top = tk.Tk()
    top.title('确认作者信息')
    top.resizable(0, 0)
    
    var = tk.StringVar(value=mails[0])
    
    txt = ttk.Label(top, text='作者:').pack(side='left')
    box = ttk.Combobox(top, width=25, values=mails, textvariable=var).pack(side='left')
    btn = ttk.Button(top, width=5, text='确定', command=verify).pack(side='left')
    
    top.update_idletasks()
    x = (top.winfo_screenwidth()  - top.winfo_reqwidth())  / 2
    y = (top.winfo_screenheight() - top.winfo_reqheight()) / 2
    top.geometry('+%d+%d' % (x, y))
    
    top.mainloop()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    2.3、启用TortoiseGit钩子

    TortoiseGit钩子可以在 TortoiseGit设置 - Hook脚本 中添加 Start Commit Hook 类型的钩子:

    也可以在工程根目录下直接新建.tgitconfig文件,编辑内容如下:

    [hook "startcommit"]
    	cmdline = python confirm.py
    	wait = true
    	show = false
    
    • 1
    • 2
    • 3
    • 4

    2.4、运行效果

    运行时自动获取当前版本库的作者名和邮箱配置信息,以及最近20次提交的作者信息,去重后显示在列表中。如果用户信息不在列表中,支持手动设置。

    点击确定后,当即配置当前版本库作者信息,在随后的提交中会以新的作者信息生效。

    如果点击关闭,不会发生任何变更。

    需要注意:

    第一次运行时会提示是否执行Hook脚本,点击运行并选择对此脚本不再询问即可:

    运行效果:

  • 相关阅读:
    启山智软/O2O商城
    国家网络安全周 | 保障智能网联汽车产业,护航汽车数据安全
    北邮22级信通院数电:Verilog-FPGA(5)第四第五周实验 密码保险箱的设计
    基于自编码器的心电信号异常检测(Pytorch)
    备考cisp拿证,收藏这一篇就够了
    Python程序设计--学生管理系统-面向对象项目
    Linux 特殊文件权限
    数字IC手撕代码--投票表决器
    Linux操作系统(一)系统初始化
    Mat介绍
  • 原文地址:https://blog.csdn.net/weixin_39804265/article/details/127995035