init-dev.sh文件位置放在根目录下。
#!/bin/bash
set -e
echo '*******************************************'
echo '***********此脚本用于开发代码时使用************'
echo '*******************************************'
#拉取代码后先执行此文件
if [[ ! -e ".git/hooks/pre-commit" ]]; then
echo "初始化checkstyle基础配置"
else
echo "更新checkstyle基础配置"
rm -rf .git/hooks/commit-msg
rm -rf .git/hooks/pre-commit
fi
cp ./checkstyle/commit-msg .git/hooks
cp ./checkstyle/pre-commit .git/hooks
chmod 700 .git/hooks/*
文件夹下分别存放以下文件。

checkstyle-9.3-all.jar自行去官网下载,传送链。

sun_checks.xml内容如下,可以按需调整:
DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="severity" value="error"/>
<property name="fileExtensions" value="java, properties, xml"/>
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
module>
<module name="SuppressionFilter">
<property name="file" value="${org.checkstyle.sun.suppressionfilter.config}"
default="checkstyle-suppressions.xml" />
<property name="optional" value="true"/>
module>
<module name="NewlineAtEndOfFile"/>
<module name="Translation"/>
<module name="FileLength"/>
<module name="LineLength">
<property name="max" value="300"/>
<property name="fileExtensions" value="java"/>
module>
<module name="TreeWalker">
<module name="InvalidJavadocPosition"/>
<module name="JavadocMethod">
<property name="allowMissingReturnTag" value="true"/>
module>
<module name="JavadocType">
<property name="allowUnknownTags" value="true"/>
module>
<module name="JavadocVariable">
<property name='ignoreNamePattern' value='.*Business|.*Service|.*Handler|.*Mapper|.*Encoder|.*ENCODER|.*Properties|.*Listener|.*Map|.*Manager|.*Template|.*Client|.*Util.*|LOG|LOGGER'/>
module>
<module name="JavadocStyle">
<property name='checkFirstSentence' value='false'/>
<property name='checkEmptyJavadoc' value='true'/>
module>
<module name="MissingJavadocMethod"/>
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<module name="MethodName"/>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
module>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName">
<property name="severity" value="warning"/>
<message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
module>
<module name="AvoidStarImport">
<property name="allowClassImports" value="true"/>
module>
<module name="IllegalImport"/>
<module name="RedundantImport"/>
<module name="UnusedImports">
<property name="processJavadoc" value="false"/>
module>
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF"/>
<property name="max" value="300"/>
module>
<module name="ParameterNumber"/>
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<module name="AvoidNestedBlocks">
<property name="allowInSwitchCase" value="true"/>
module>
<module name="EmptyBlock"/>
<module name="LeftCurly"/>
<module name="NeedBraces"/>
<module name="RightCurly"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
module>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<module name="MissingSwitchDefault"/>
<module name="MultipleVariableDeclarations"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="FinalClass"/>
<module name="InterfaceIsType"/>
<module name="VisibilityModifier"/>
<module name="ArrayTypeStyle"/>
<module name="TodoComment"/>
<module name="UpperEll"/>
<module name="SuppressionXpathFilter">
<property name="file" value="${org.checkstyle.sun.suppressionxpathfilter.config}"
default="checkstyle-xpath-suppressions.xml" />
<property name="optional" value="true"/>
module>
<module name="Regexp">
<property name="format" value=".printStackTrace"/>
<property name="illegalPattern" value="true"/>
module>
<module name="Regexp">
<property name="format" value="System.out.println"/>
<property name="illegalPattern" value="true"/>
module>
<module name="TrailingComment"/>
<module name="TodoComment"/>
<module name="UncommentedMain">
<property name="excludedClasses" value=".*[Application,Test]$"/>
module>
module>
module>
pre-commit文件内容如下,可以配置具体的项目代码位置,或者仅扫描提交的代码。
#!/bin/sh
echo '*******************************************'
echo '***************强制检查代码规范***************'
echo '****参考:Checkstyle代码规范检查使用教程.md****'
echo '*******************************************'
#指定路径扫描
#java -jar checkstyle/checkstyle-9.3-all.jar -c checkstyle/sun_checks.xml abc-modules/abc-upms-biz/src
#每次扫描仅对当前提交的内容来扫
#java -jar checkstyle/checkstyle-9.3-all.jar -c checkstyle/sun_checks.xml $(git diff --cached --name-only --diff-filter=ACM -- '*.java')
java -jar checkstyle/checkstyle-9.3-all.jar -c checkstyle/sun_checks.xml $(git diff --cached --name-only --diff-filter=ACM -- '*')
exitCode="$?"
exit $exitCode
commit-msg的内容如下:
#!/bin/sh
echo '*******************************************'
echo '********强制检查git commit msg提交格式********'
echo '******提交格式参考文档:Git提交日志规范.md******'
echo '*******************************************'
# 用 `` 可以将命令的输出结果赋值给变量
# 获取当前提交的 commit msg
commit_msg=`cat $1`
# 获取用户 email
email=`git config user.email`
msg_re="^(feat|fix|docs|style|refactor|perf|test|workflow|build|ci|chore|release|workflow)(\(.+\))?: .{1,100}"
if [[ ! $commit_msg =~ $msg_re ]]
then
echo "\n不合法的 commit 消息提交格式,请使用正确的格式:\
\nfeat: add comments\
\nfix: handle events on blur (close #28)\
\n详情请查看 git commit 提交规范:https://github.com/woai3c/Front-end-articles/blob/master/git%20commit%20style.md"
# 异常退出
exit 1
fi
# 对用户权限做判断则比较简单,只需要检查用户的邮箱或用户名就可以了(假设现在只有 abc 公司的员工才有权限提交代码)。
#email_re="@abc\.com"
#if [[ ! $email =~ $email_re ]]
#then
# echo "此用户没有权限,具有权限的用户为: xxx@abc.com"
#
# # 异常退出
# exit 1
#fi
以上配置完成之后,执行脚本init-dev.sh初始化配置即可生效,之后在提交代码时,就可以针对代码规范进行检查、针对Git提交的msg信息格式进行检查。
sh init-dev.sh
以下是Git提交日志的规范:
提交代码时,如果不能形成有效约束,依靠个人的自觉,这样即使每个人是积极的状态,但是每个人的知识构成不同,也会造成提交风格迥异。
():
大致分为三个部分(使用空行分割):
commit 的类型:
commit 影响的范围, 比如: route, component, utils, build…
commit 的概述
commit 具体修改内容, 可以分为多行.
一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接.
以下内容来源于:https://www.conventionalcommits.org/zh-hans/v1.0.0-beta.4/
feat 或 fix ,其后接一个可选的作用域字段,以及一个必要的冒号(英文半角)和空格。feat 类型。bug 时,必须使用 fix 类型。fix(parser):fix: array parsing issue when multiple spaces were contained in string.BREAKING CHANGE,后面紧跟冒号和空格。BREAKING CHANGE: 之后必须提供描述,以描述对 API 的变更。例如: BREAKING CHANGE: environment variables now take precedence over config files.feat 和 fix 之外的类型。BREAKING CHANGE 必须是大写的。! 字符,以进一步提醒注意破坏性变更。当有 ! 前缀时,正文或脚注内必须包含 BREAKING CHANGE: description如果修复的这个BUG只影响当前修改的文件,可不加范围。如果影响的范围比较大,要加上范围描述。
例如这次 BUG 修复影响到全局,可以加个 global。如果影响的是某个目录或某个功能,可以加上该目录的路径,或者对应的功能名称。
// 示例1
fix(global): 修复checkbox不能复选的问题
// 示例2 下面圆括号里的 common 为通用管理的名称
fix(common): 修复字体过小的BUG,将通用管理下所有页面的默认字体大小修改为 14px
// 示例3
fix: value.length -> values.length
feat: 添加网站主页静态页面
这是一个示例,假设对点检任务静态页面进行了一些描述。
这里是备注,可以是放BUG链接或者一些重要性的东西。
chore 的中文翻译为日常事务、例行工作,顾名思义,即不在其他 commit 类型中的修改,都可以用 chore 表示。
chore: 将表格中的查看详情改为详情