在git pre-commit hook里格式化代码

124 阅读1分钟

多人合作的项目里,格式化是一个问题。可能有些人的代码没有格式化,可能有些人的代码格式化配置不同。这里提出一种方案,来实现自动化的,风格相同的代码格式化方案。 注意,此方案没有实践过。

git pre-commmit hook

git 支持一些hook,可以在指定的一些时间发生时,执行这些hook。 pre-commit hook就是在commit前自动执行的脚本。 此方案在pre-commit hook里执行格式化步骤。

一个示例文件

以下是我刚刚配置的git pre-commot hook文件

#!/bin/sh

changed_files="$(git diff --cached --name-only --diff-filter=d | grep ".py$" | tr '\n' ' ')"

black $changed_files
git add $changed_files

下面来解释一下这些命令的意思

找到需要格式化的文件

pre-commit hook应该是一段很快就能执行的程序。所以,最好不要格式化整个仓库。 一般地,只需要格式化除了删除的文件之外所有更改的文件。另外也可以结合项目实际,进行过滤。

这行命令找出除了删除的文件之外所有更改的.py文件,然后以空格隔开它们的路径。

git diff --cached --name-only --diff-filter=d | grep ".py$" | tr '\n' ' ')

格式化

这个根据自己项目实际来配置就行了。比如我用的是black。 另外,格式化之后,还要git add以下,否则commit里的是格式化前的结果。

总结

以上只是一个想法。等我做新项目的时候,得尝试一下。