Git -- git commit hook

团队合作项目,使用git时会发生这种情况 : 每个人的代码格式不同,对比工具再做对比的时候常常会当作冲突来处理,虽然有些工具会有明显的提示,但还是会占用自己太多时间。同时,一个团队保持一致的代码风格和规范,甚至是工具,都是有必要的。

经过一顿 google 之后, 发现git 的 hook pre-commit这个脚本可以指定,再commit之前插入一些脚本执行,要是再这个脚本中加上对代码的格式化,就解决了这个问题。

1、代码的格式化工具我选择了google提供的代码格式化工具。
项目地址在这里 https://github.com/google/google-java-format
通过文档给的方式,在android studio下载一个插件

Paste_Image.png

再设置中配置,这里的style我选的是 aosp 的style,因为是android 项目,并没有直接使用默认的。配置好之后,我再对代码进行格式化的时候,就使用了google-java-format,不再是之前再ide中配置的那个了。

Paste_Image.png

2、接下来写shell
我们在项目根目录中可以找到.git 下的hooks文件夹。里面存在一堆文件,就像这样。
Paste_Image.png
可以创建一个空文件,名字为pre-commit。这里我直接贴上一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#
array=`git diff-index --name-only HEAD`

for name in ${array}
do
extension=${name##*.}
if [[ ${extension} == "java" || ${extension} == "xml" || ${extension} == "kt" ]];then
D:\\Applications\\tiny-tool\\formatjava.cmd ${name}
if [ $? -eq 0 ]; then
echo "format ok" ${name}
else exit 1
fi
fi
done

exec git add ./

大兄弟,别的都好说,

${name} ```有点看不明白,那是因为还差一个文件没有贴上来。就是formatjava.cmd这个文件
1
2
3
4
```
@ECHO OFF
java -jar D:\Applications\tiny-tool\google-java-format-1.3-all-deps.jar --replace %*
@ECHO ON

看这个工具还挺好用,可以直接格式化java代码,直接写一个cmd放到系统path中去,平时也能使用。

这样,再git commit 之后,会自动将提交的java文件进行格式化。这样就在本地和远程都使用同一套代码规范了。

ps:有个问题,google-java-format-1.3-all-deps.jar这个版本的会把java doc 也格式化了, 蛋疼, 还好有广大网友的帮助
https://github.com/Kurt-Bonatz/google-java-format/tree/skip_javadoc_formatting
这个提交已经添加到了google的代码中了, 就等着google更新, 或者直接把代码撸下来编译

c2adb464jw1edbze0mbitg2064064kjb.gif