当前位置: 首页 > 科技观察

你可能忽略了gitcommit规范

时间:2023-03-15 20:36:17 科技观察

简介在日常的开发工作中,我们通常会使用git来管理代码。当我们对代码进行一些改动时,可以通过gitcommit来提交代码。Git规定提交时必须写提交信息,作为对变更的描述,保存在提交历史中,方便回溯。一个标准化的日志,不仅可以帮助别人审阅,还可以有效的输出CHANGELOG,甚至可以大大提高项目开发的质量。但是在日常工作中,大部分同学只是单纯的写日志信息,并没有太在意。这对于项目管理和维护来说无疑是不友好的。这篇文章主要是根据自己的经验,给大家分享一些gitcommit的规范,让你的日志不仅“好看”,而且“实用”。Whystandardizegitcommit一直在说要规范commit格式,那么为什么要这么做呢?我们先来看一个不规范的commit记录:看完是什么感觉,写了什么(innerOS),这种commit信息对于想从中获取有效信息的人来说无疑是致命一击。那我们来看看社区流行的Angular规范的commit记录:看完是不是一目了然?上图中标准的commit信息首先提供了更多的历史信息,方便快速浏览。其次,可以过滤某些提交(例如文档更改)以方便快速查找信息。现在Angular团队的规范是社区比较流行的commit规范,那到底是什么呢?让我们仔细看看它。Angular团队的commit规范有如下消息格式:()://Emptyline//Emptyline

对应Commit消息的三部分:页眉、正文和页脚。HeaderHeader部分是一行,包括三个字段:类型(必填)、范围(可选)和主题(必填)。type:用于描述commit的类型。一般有以下几种:feat:addfeaturefix:fixbugdocs:只修改文档,比如readme.mdstyle:只修改格式,比如逗号、缩进、空格等,代码逻辑没有改变。refactor:代码重构,无新特性或bug修复perf:优化相关,如提升性能、用户体验等test:测试用例,包括单元测试和集成测试。chore:改变构建过程,或者添加依赖库、工具等。revert:版本回滚scope:用于说明commit影响的范围,如:views、component、utils、test...subject:简短描述purposeofcommitBody对本次commit修改内容的具体描述,可以分多行。如下图所示:#body:72-characterwrapped.Thisshouldanswer:#*Whywasthischangenecessary?#*Howdoesitaddresstheproblem?#*Arethereanysideeffects?#initialcommitFooter一些备注,通常是BREAKINGCHANGE(当前代码与之前版本不兼容)或者fixed错误(关闭Issue)的链接。简单介绍了以上规范之后,我们来说说commit.template,也就是git提交信息模板。gitcommitmessagetemplate如果你的团队有commitmessage的格式要求,你可以在你的系统上创建一个文件并配置git将其作为默认模板,这样更容易让commitmessages遵循格式。使用如下命令配置提交信息模板:gitconfigcommit.template[模板文件名]//该命令只能设置当前分支的提交模板gitconfig——globalcommit.template[模板文件名]//该命令可以设置global提交模板,注意global前面有两个横条。新的.gitmessage.txt(模板文件)的内容可以如下:#headr:():#-type:feat,fix,docs,style,refactor,test,chore#-scope:canbeempty#-subject:startwithverb(suchas'change'),50-characterline##body:72-characterwrapped.Thisshouldanswer:#*Whywasthischangenecessary?#*Howdoesitaddresstheproblem?#*Areethereanysideeffects?##footer:#-Includealinktotheissue.回复#-BREAKINGCHANGE#看完以上,是不是和我一样觉得配置很麻烦,配置一个近乎完美的适合自己和团队的commit规范似乎不是一件容易的事。不过社区也为我们提供了一些辅助工具来帮助提交,下面对这些工具进行简单介绍。commitizen(cz-cli)commitizen是一个可以交互式创建提交信息的工具。它帮助我们从类型开始逐步构建提交信息。具体效果如图:首先用上下键控制,指向你想要的类型,对应上面提到的feat、fix、docs、perf等:然后让你选择文件affectedbythissubmission:稍后,你会被要求写一个简短而详细的submissiondescription:最后,你会被要求确定这个submission是一个BREAKINGCHANGE还是与一个openissue相关:阅读上面的commitizen的整个过程,让我们看看如何安装它。在全局环境下安装:commitizen根据不同的适配器配置commitmessage。例如,要使用Angular的提交消息格式,请安装cz-conventional-changelog。#需要同时安装commitizen和cz-conventional-changelog,后者是adapter$npminstall-gcommitizencz-conventional-changelog#配置安装的adapter$echo'{"path":"cz-conventional-changelog"}'>~/.czrc#使用$gitcz本地项目安装:#installcommitizen$npminstall--save-devcommitizen#接下来安装适配器#fornpm>=5.2$npxcommitizeninitcz-conventional-changelog--save-dev--save-exact#fornpm<5.2$./node_modules/.bin/commitizeninitcz-conventional-changelog--save-dev--save-exact//在package.jsonscript字段添加commit命令"scripts":{"commit":"git-cz"}//use$npmrunco??mmitcommitlintcommitlint是一个提交验证工具。原理是在真正的gitcommit提交到远程仓库之前,可以使用githooks来校验信息。提交不符合规则的信息将被阻止提交到远程仓库。先看下demo:对于ConventionalCommits规范,社区已经整理了@commitlint/config-conventional包,我们只需要安装并启用即可。首先安装commitlint和常规规范:npminstall--save-dev@commitlint/cli@commitlint/config-conventional然后在package.json中配置commitlint脚本:"commitlint":{"extends":["@commitlint/config-conventional"]},当然,如果你想单独配置commitlint,你需要创建一个验证文件commitlint。使用一个工具——哈士奇。husky是一个增强的githook工具。我们在package.json中配置的npm脚本可以在githook的各个阶段执行。先安装husky:npminstall--save-devhusky然后在package.json配置commitmsg脚本:"husky":{"hooks":{"commit-msg":"commitlint-EHUSKY_GIT_PARAMS"}},这里配置commitlint好了~平时gitmoji-cli和朋友聊天的时候,我们肯定会用到表情包,比如说。表情符号的出现让我们和朋友之间的交流变得更加有趣。如果在git中提交commit的时候可以使用表情符号(),岂不是让每一次commit都更加直观,维护起来也更加方便。Gitmoji就是一个可以实现这个功能的插件。让我们先感受下是不是爽~~其实gitmoji的使用很简单:#installnpmi-ggitmoji-cli#usegitcommit-m':bug:problemfix'来看看官方的例子:是你跃跃欲试了吗?gitmoji项目地址:https://github.com/carloscuesta/gitmoji/gitmoji使用示例:https://gitmoji.carloscuesta.me/看完这篇文章,是不是感觉对gitcommitmessage有了新的认识呢?去并在你的项目中使用这些使你的提交更加标准化,并且不要忘记将表情符号添加到你的日志中!最后附上一个之前项目中为gitcommit配置的package.json作为参考:{"name":"ts-axios","version":"0.0.0","description":"","keywords":[],"main":"dist/ts-axios.umd.js","module":"dist/ts-axios.es5.js","typings":"dist/types/ts-axios.d.ts","files":["dist"],"author":"fengshuan<1263215592@qq.com>","re??pository":{"type":"git","url":""},"license":"MIT","engines":{"node":">=6.0.0"},"scripts":{"dev":"nodeexamples/server.js","lint":"tslint--projecttsconfig.json-tcodeFrame'src/**/*.ts''test/**/*.ts'""prebuild":"rimrafdist","build":"tsc--modulecommonjs&&rollup-crollup.config.ts&&typedoc--outdocs--targetes6--thememinimal--modefilesrc","start":"rollup-crollup.config.ts-w","test":"jest--coverage","test:watch":"jest--coverage--watch","test:prod":"npmrunlint&&npmruntest----no-cache","deploy-docs":"ts-nodetools/gh-pages-publish","re??port-coverage":"cat./coverage/lcov.info|coveralls","commit":"git-cz","semantic-release":“语义发布”,“语义发布准备”:“ts-nodetools/语义发布准备”,“预提交”:“lint-staged”,“travis-deploy-once":"travis-deploy-once"},"husky":{"hooks":{"commit-msg":"commitlint-EHUSKY_GIT_PARAMS"}},"lint-staged":{"{src,test}/**/*.ts":["prettier--write","gitadd"]},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"jest":{"transform":{".(ts|tsx)":"ts-jest"},"testEnvironment":"node","testRegex":"(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$","moduleFileExtensions":["ts","tsx","js"],"coveragePathIgnorePatterns":["/node_modules/","/test/"],"coverageThreshold":{"global":{"branches":90,"functions":95,"lines":95,"statements":95}},"collectCoverageFrom":["src/*.{js,ts}"]},"prettier":{"semi":false,"singleQuote":true},"commitlint":{"extends":["@commitlint/config-conventional"]},"devDependencies":{"@commitlint/cli":"^7.1.2","@commitlint/config-conventional":"^7.1.2","@types/jest":"^23.3.2","@types/node":"^10.11.0","body-parser":"^1.19.0","colors":"^1.3.2","commitizen":"^3.0.0","coveralls":"^3.0.2""cross-env":"^5.2.0","cz-conventional-changelog":"^2.1.0","express":"^4.17.1","husky":"^1.0.1""jest":"^23.6.0","jest-config":"^23.6.0","lint-staged":"^8.0.0","lodash.camelcase":"^4.3.0","更漂亮":"^1.14.3","舞会pt":"^1.0.0","替换文件":"^3.4.2","rimraf":"^2.6.2","rollup":"^0.67.0","rollup-plugin-commonjs":"^9.1.8","rollup-plugin-json":"^3.1.0","rollup-plugin-node-resolve":"^3.4.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.18.0","语义发布":"^15.9.16","shelljs":"^0.8.3","travis-deploy-once":"^5.0.9","ts-jest":"^23.10.2","ts-loader":"^6.1.1","ts-node":"^7.0.1","tslint":"^5.11.0","tslint-config-prettier":"^1.15.0","tslint-config-standard":"^8.0.1","tslint-loader":"^3.5.4","typedoc":"^0.12.0","typescript":"^3.0.3","webpack":"^4.40.2","webpack-dev-middleware":"^3.7.1","webpack-hot-middleware":"^2.25.0"}}