今天分享一个特别的东西 Git Hooks,会研究这个是因为我想将不同专案的 commit 纪录起来,方便之后查阅,查了一些资料发现原来 Git 本身有提供 Hooks(钩子) 的功能,可以在 commit 的前后执行我们写的 Script,一般常用来检查提交讯息是否符合团队规定,或执行自动化测试等等,而我的用法好像比较特别。
Git Hooks 可以用的 Script 有很多,这篇我就用自己相对熟悉的 Python 语言,前阵子有用来练习一些题目,可以较快上手。
Git Hooks
每个 Git 专案下都有个 .git
的隐藏资料夹,git hooks 就放在 .git 里面的 hooks
资料夹内,开启后可以看到 .sample 副档名的档案。
Hooks 的种类很多,我用到的是 commit-msg
,它会在用户提交讯息后被执行,利用这个 hook 就可以在提交后,执行纪录 commit 的脚本。
程式
#!/usr/bin/pythonimport sysimport osimport reimport csvimport datetimeimport subprocesscommit_msg_filepath = sys.argv[1]with open(commit_msg_filepath, 'r', encoding='UTF-8') as f: dateTime = datetime.datetime.now().strftime("%Y-%m-%d") name = subprocess.check_output(['git', 'show', '-s', '--format=%an']).decode('UTF-8').strip() content = f.read().strip('\n') branch = subprocess.check_output(['git', 'symbolic-ref', '-q', '--short', 'HEAD']).decode('UTF-8').strip() project = os.path.basename(os.getcwd()) # 改成自己的存放路径 csvPath = 'C:\\CommitLog\\CommitLog.csv' with open(csvPath, 'a', encoding='Big5', newline='') as csvFile: writer = csv.writer(csvFile, quotechar='"', quoting = csv.QUOTE_ALL) writer.writerow([dateTime, project, name, content, branch]) print('Commit log created!!!')sys.exit(0)
说明
1. dateTime (提交日期)
现在时间只取日期的部分
2. name (用户名称)
这里用到 git 指令 git show -s --format=%an
可以取得用户名
3. content (提交讯息)
从 sys.argv[1]
可以取得储存提交讯息的档案路径
4. branch (分支)
同样用到 git 指令 git symbolic-ref -q --short HEAD
取得当前分支
5. project (专案名称)
从脚本存放的路径取得
程式中 print
的内容可以在 commit 视窗看到
程式最后的 sys.exit(0)
代表该 hooks 执行成功,将 0 改为 1 则代表失败,就会出现上图不正常结束的讯息。
还有一点要特别注意,想要启动 hooks 需要将 .sample
副档名拿掉,这边让我卡关好久,不管怎么改程式都没反应,原来没有 .sample 才是 hooks 的正确档名。
结语
原来想将结果製作成 Excel,但没有 Python 存取 Excel 的经验,所以偷懒改用 CSV,Excel 开启后感觉差不多,不过还是欢迎有经验的大大,推荐好用的 Excel 套件给小弟,今天就到这里搂,感谢大家观看。