其实使用Gradle和Git Hooks优化Android Studio项目提交流程的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享使用Gradle和Git Hooks优化Android Studio项目提交流程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
下面分两部分介绍,分别是提交日志部分和代码检测部分。
提交日志的检查
要求
对于每个提交,Commit 消息包括三部分:页眉、正文和页脚。 ()://空行//空行其中,Header 为必填项,Body 和Footer 可以省略。
无论部分如何,任何行都不得超过72 个字符(或100 个字符)。这是为了防止自动换行影响外观。
Header 部分只有一行,包括三个字段:类型(必填)、范围(可选)和主题(必填)。
**type** 用于描述提交的类别。仅允许使用以下7 个标识符。
- feat:新功能(特性)
-fix: 修复错误
- docs: 文档(文档)
- style:格式(不影响代码运行的更改)
- refactor: 重构(即不是新功能或错误修复的代码更改)
- perf:性能优化(性能)
- test:添加测试
- Chore: 对构建过程或辅助工具的更改
- revert: 还有另一种特殊情况。如果当前提交用于撤消之前的提交,则必须以revert: 开头,后面是取消的Commit 的Header。
revert: feat(pencil): 添加"graphiteWidth" 选项
**scope**用于描述commit的影响范围,比如数据层、控制层、视图层等,根据项目的不同而不同。
**主题** 是提交目的的简短描述。
Body 部分的格式是固定的,必须写为This reverts commit hash.其中hash 是撤销提交的SHA 标识符。
实现
我们修改commit-msg 文件。由于我们对shell脚本不熟悉,所以通过python来实现。注意修改commit-msg文件顶部的代码。
将要
#!/bin/sh 修改为
#!/usr/bin/python2.6 否则python脚本将无法被识别
1、首先创建commit-msg相关的配置文件(commit-msg-config.txt),并将该文件放在与commit-msg同一目录下。我们在里面放入一些正则表达式和提示信息,方便后期修改和维护,commitMessageRegex=.+(nn.){0,2}
commitMessage=代码提交备注需要统一格式。格式为:n页眉(72个字符以内)+空行+正文(72个字符以内,可省略)+空行+页脚(72个字符以内,可省略);
HeadLengthMessage=标题中的字数不能超过72 个字符
HeadFormatMessage=Head 的格式为():type(必填)、scope(可选)和subject(必填)。 **type** 用于描述提交的类别。仅允许使用以下7 个标识符。 n**scope** 用于描述commit的影响范围,比如数据层、控制层、视图层等,根据项目的不同而不同。 n**主题** 是提交目的的简短描述
headTypeRegex=^(feat|修复|docs|style|refactor|perf|test|chore)((.*)){0,1}$|^revert$
headTypeMessage=type 可选值为: feat: 新函数(feature) fix: 修复bugndocs: 文档(documentation) style: 格式(不影响代码运行的改动) refactor: 重构(即不是新函数) ,也不是修复bug的代码)更改)perf:性能优化(性能)test:添加测试chore:构建过程或辅助工具的更改revert:当前提交用于撤消之前的提交
RevertCommitHeadMessage=您的类型是revert,必须以revert:开头,后面是撤回的Commit的Header。目前检测到撤回的Commit的Header格式不正确。
RevertMessage=您的类型是revert,必须以revert:开头,后面是未提交的Commit的Header。例如:n revert: feat(pencil): 添加"graphiteWidth" 选项
BodyLengthMessage=正文不能超过72 个字符
FootLengthMessage=Body不能超过72个字符2.修改commit-msg文件#!/usr/bin/python2.6
#编码=utf-8
#
# 用于检查提交日志消息的示例挂钩脚本。
# 由"git commit" 使用一个参数调用,即文件名
# 有提交消息。钩子应该以非零值退出
# 如果想要停止则发出适当的消息后的状态
犯罪。允许钩子编辑提交消息文件。
#
# 要启用此挂钩,请将此文件重命名为“commit-msg”。
# 取消注释以下内容以将Signed-off-by 行添加到消息中。
# 一般来说,在钩子中执行此操作是一个坏主意,但准备提交消息
#hook 更适合它。
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n "s/^(.*).*$/Signed-off-by: 1/p")
# grep -qs "^$SOB" "$1" ||回声“$SOB”“$1”
# 此示例捕获重复的Signed-offby 行。
# 测试""="$(grep "^Signed-off-by: " "$1" |
# 排序| uniq-c| sed -e "/^[ ]*1[ ]/d")" || {
# echo 2 重复的签名行。
# 退出1
# }
进口再
导入系统
导入操作系统
地图=字典()
configFile=open(".git/hooks/commit-msg-config.txt","r")
对于open(".git/hooks/commit-msg-config.txt"): 中的行
行=configFile.readline()
值=line.split("=",2)
如果len(值)==2:
地图[值[0]]=值[1]
文件路径=sys.argv[1]
文件=打开(文件路径)
内容=file.read(os.path.getsize(filePath))
machObject=re.match(map["commitMessageRegex"], 内容, flags=0)
如果不是machObject:
打印地图["commitMessage"]
退出(1)
splitArray=content.split("nn",3)
if len(splitArray[0].decode("utf-8")) 73:
打印地图["HeadLengthMessage"]
退出(1)
头=splitArray[0]
splitHead=head.split(":",2)
如果len(splitHead) 2 或len(splitHead)3:
打印地图["HeadFormatMessage"]
退出(1)
machHead=re.match(map["headTypeRegex"],splitHead[0],flags=0)
如果不是machHead:
print (地图["headTypeMessage"])
退出(1)
如果splitHead[0]=="revert" 且len(splitHead)==3:
machRevertHead=re.match(headRegex,splitHead[1],flags=0)
如果不是machRevertHead:
打印地图["RevertCommitHeadMessage"]
退出(1)
否则:
打印地图["RevertMessage"]
退出(1)
如果len(splitArray) 1 和len(splitArray[1].decode("utf-8")) 73:
打印地图["BodyLengthMessage"]
退出(1)
如果len(splitArray) 2 和len(splitArray[2].decode("utf-8")) 73:
打印地图["FootLengthMessage"]
退出(1)
file.close()下面的代码用于读取我们之前创建的配置文件
地图=字典()
configFile=open(".git/hooks/commit-msg-config.txt","r")
对于open(".git/hooks/commit-msg-config.txt"): 中的行
行=configFile.readline()
值=line.split("=",2)
如果len(值)==2:
map[value[0]]=value[1] 这段代码用于读取我们提交的日志并判断其格式是否正确。
文件路径=sys.argv[1]
文件=打开(文件路径)
content=file.read(os.path.getsize(filePath)) 保存后,但是当我们再次通过git提交代码时,git hooks会检查日志。如果不符合格式,则会打印出错误并终止。提交操作。请记住,commit-msg 的后缀.sample 需要删除。如果还是不行的话可以通过
chmod a+x 提交消息
授予其读写权限。
提交代码的检查
原理
Android 的Gradle Api 本身具有checkStyle 类型的任务。我们需要应用checkstyle插件并实现这样一个任务来检查代码风格并生成检查报告。代码如下:
所有项目{
.
.
应用plugin:"checkstyle"
检查样式{
configFile rootProject.file("checkstyle.xml")
工具版本“6.19”
忽略失败false
显示违规行为true
}
任务("checkstyle",type: Checkstyle){
源“src/main/java”
包含“**/*.java”
排除“**/R.java”
排除“**/BuildConfig.java”
类路径=文件()
}
}可以通过hook git commit来执行这个脚本,然后根据检查结果决定是否提交。
实现
我们需要做的第一件事如下:
1.编写一个checkstyle xml文件。 2.使用checkstyletask的include和exclusion来添加必需和不必要的java类。 3.编写一个git hook文件来调用checkstyle任务并粘贴checkstyle xml文件。您可以根据自己的实际项目需求进行配置。
?xml version="1.0"?gradle中的exclude文件比较容易写,但是include要求我们只检查修改过的文件,否则每次检查整个项目会花费很多时间。
我们知道git status -s 可以获取修改后的文件字符串,所以我们在gradle中调用这个命令来获取修改后的文件列表。
def getChangeFiles() {
尝试{
String changeInfo="git status -s".execute(null, project.rootDir).text.trim()
返回changeInfo==null ? "" : 变更信息
} catch (异常e) {
返回""
}
然后解析这个字符串得到修改后的java文件类名集合。实现函数如下:
def filterCommitter(String gitstatusinfo) {
ArrayListfilterList=new ArrayList();
String[]lines=gitstatusinfo.split("\n")
for (字符串行: 行) {
if (line.contains(".java")) {
String[] spliters=line.trim().split(" ");
for (String str : splitters) {
if (str.contains(".java")) {
过滤列表.add(str)
}
}
}
}
返回过滤器列表;
这样,我们就可以将上述java文件包含在gradle中,然后我们可以使用gradle任务仅检查修改后的java文件的样式。
下面贴出gradle的完整代码
//顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。
构建脚本{
存储库{
jcenter()
}
依赖项{
类路径"com.android.tools.build:gradle:2.1.0"
//注意: 不要将应用程序依赖项放在这里;他们属于
//在各个模块的build.gradle 文件中
}
}
所有项目{
存储库{
jcenter()
mavenCentral()
}
应用plugin:"checkstyle"
检查样式{
工具版本“6.13”
忽略失败false
显示违规行为true
}
}
任务清理(type: 删除){
删除rootProject.buildDir
}
任务checkstyle(type: Checkstyle) {
源“app/src/main/java”
排除“**/gen/**”
排除“**/R.java”
排除“**/BuildConfig.java”
if (project.hasProperty("checkCommit") project.property("checkCommit")) {
def ft=filterCommitter(getChangeFiles());
def includeList=new ArrayList()
for (int i=0; i ft.size(); i++) {
字符串分割器=ft.getAt(i)
String[] spliterlist=spliter.split("/")
字符串文件名=spliterlist[spliterlist.length - 1]
includeList.add("**/" + 文件名)
}
if (includeList.size()==0) {
排除“**/*.java”
} 别的{
println("includeList=="+includeList)
包含包含列表
}
} 别的{
包含“**/*.java”
}
configFile rootProject.file("checkstyle.xml")
类路径=文件()
}
def getChangeFiles() {
尝试{
String changeInfo="git status -s".execute(null, project.rootDir).text.trim()
返回changeInfo==null ? "" : 变更信息
} catch (异常e) {
返回""
}
}
def filterCommitter(String gitstatusinfo) {
ArrayListfilterList=new ArrayList();
String[]lines=gitstatusinfo.split("\n")
for (字符串行: 行) {
if (line.contains(".java")) {
String[] spliters=line.trim().split(" ");
for (String str : splitters) {
if (str.contains(".java")) {
过滤列表.add(str)
}
}
}
}
返回过滤器列表;
}在gradle文件中添加checkstyle任务后,我们还需要在git commit时自动检查它。这时候我们就需要修改git hook。
我们去掉./git/hook/pre-commit文件的.sample后缀,调用其中的gradle任务,通过任务的输出来判断是否可以提交。代码如下:
#!/bin/sh
#
# 用于验证将要提交的内容的示例挂钩脚本。
# 由“git commit”调用,不带任何参数。钩子应该
# 发出适当的消息后以非零状态退出if
# 它想要停止提交。
#
# 要启用此挂钩,请将此文件重命名为“预提交”。
如果git rev-parse --verify HEAD /dev/null 21
然后
反对=头
别的
# 针对空树对象的初始commit: diff
针对=4b825dc642cb6eb9a060e54bf8d69288fbee4904
菲
SCRIPT_DIR=$(目录名"$0")
SCRIPT_ABS_PATH=`cd "$SCRIPT_DIR";密码`
$SCRIPT_ABS_PATH/././gradlew -PcheckCommit="true" checkstyle
如果[ $? -eq 0];然后
echo "检查样式确定"
别的
退出[[ $ERROR_INFO=~ "checkstyle" ]] 退出1
菲
# 如果您想允许非ASCII 文件名,请将此变量设置为true。
allownonascii=$(git config --bool hooks.allownonascii)
# 将输出重定向到stderr。
执行12
# 跨平台项目
s tend to avoid non-ASCII filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it"s # even required, for portability to Solaris 10"s /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d "[ -~] " | wc -c) != 0 then cat<【使用Gradle和Git Hooks优化Android Studio项目提交流程】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这篇文章真是太棒了!终于能摆脱每次手动检查提交日志和代码格式烦恼了。
有10位网友表示赞同!
我一直在想怎么实现这种自动检查功能,想不到可以用Gradle和Git Hooks一起完成,效率太高了。
有20位网友表示赞同!
学习一下Android Studio项目使用 Gradle 和 Git Hooks 进行提交检查,应该能提高开发工作效率。
有13位网友表示赞同!
对代码的 CheckStyle 检查非常重要,这篇文章能帮助我保证代码风格的一致性。
有15位网友表示赞同!
Git Hooks 的应用太棒了,可以定制各种自动化任务,这个实践很有用的启发。
有12位网友表示赞同!
我已经在其他项目中使用 Git Hooks 了,这次学习 Android Studio 中的用法应该能帮助我更好地运用它。
有20位网友表示赞同!
提交日志格式很重要,这样可以让代码审查更方便,这篇文章帮我找到了一个高效的工具。
有14位网友表示赞同!
期待了解更多关于 Gradle 和 Git Hooks 的应用案例,这两种技术真的太牛了!
有5位网友表示赞同!
我经常会犯提交日志写错的错误,这个功能能帮到我不少啊。
有8位网友表示赞同!
Android 项目中使用这些工具可以很大程度上提高开发质量和效率,值得学习一下。
有6位网友表示赞同!
我想知道这篇文章会详细讲解如何配置 Gradle 和 Git Hooks 的具体步骤吗?
有6位网友表示赞同!
我对代码风格检查也比较重视,这个 CheckStyle 检查功能让我很感兴趣。
有10位网友表示赞同!
希望这篇文章能够提供更具体的示例,方便我更好地理解和应用这些技术。
有5位网友表示赞同!
学习新的开发工具总是很有挑战性,但成果也是非常明显的。
有18位网友表示赞同!
这种自动化检查功能可以节省很多时间,提高工作效率。真是个好东西!
有6位网友表示赞同!
现在越来越多人开始关注代码质量和开发规范,这篇文章能帮助我更好地实践这些要求。
有15位网友表示赞同!
分享这样的经验和技巧总是很宝贵,感谢作者的分享!
有7位网友表示赞同!
我已经记下来要学习 Gradle 和 Git Hooks 的方法了,可以提高我的开发水平。
有10位网友表示赞同!