从事嵌入式开发的人运行软件依赖于特定的电脑硬件,可能会存在多人在同一台电脑上开发的需求。
我们使用git
进行软件代码版本管理,通过提交时的用户名和邮箱区分某次代码是哪个人提交的信息。git
自身支持提交的时临时一次设置成其他的用户信息,但是需要单独命令配置,难免偶尔会忘记。
为了避免疏忽引起提交错误的用户信息,我利用TortoiseGit的钩子功能,在提交代码前触发弹出用户交互界面,引导用户选择或设定正确的账户信息,并根据选择情况修改git
仓库配置,随后提交的代码即会按照新的信息记录。
安装git、TortoiseGit、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()
TortoiseGit钩子可以在 TortoiseGit设置 - Hook脚本
中添加 Start Commit Hook
类型的钩子:
也可以在工程根目录下直接新建.tgitconfig
文件,编辑内容如下:
[hook "startcommit"]
cmdline = python confirm.py
wait = true
show = false
运行时自动获取当前版本库的作者名和邮箱配置信息,以及最近20次提交的作者信息,去重后显示在列表中。如果用户信息不在列表中,支持手动设置。
点击确定后,当即配置当前版本库作者信息,在随后的提交中会以新的作者信息生效。
如果点击关闭,不会发生任何变更。
需要注意:
第一次运行时会提示是否执行Hook脚本,点击运行并选择对此脚本不再询问即可:
运行效果: