如何为Android repo工具实现Git Hook?pre-commit配置难题求解
我之前也踩过类似的坑——Repo官方文档确实只重点提及了pre-upload hook,对其他Git hook的支持没有直接说明,但其实我们可以借助Git原生的hook机制,结合Repo的批量操作能力,轻松实现全项目统一的pre-commit检查。下面分享几个亲测有效的方法:
方法1:单个子仓库手动配置(适合临时测试)
如果只是想给某个子仓库单独加pre-commit hook,步骤很简单:
- 进入目标子仓库的
.git/hooks目录 - 复制示例文件并修改:
cp pre-commit.sample pre-commit - 打开
pre-commit脚本,替换成你的检查逻辑(比如代码lint、格式校验、敏感信息扫描等) - 给脚本添加执行权限:
chmod +x pre-commit
这种方式的缺点是每个子仓库都要单独配置,团队协作时很难统一维护。
方法2:统一管理所有子仓库的hooks(推荐)
要实现全项目的pre-commit hook统一管理,可以按以下步骤操作:
创建统一的hook脚本
在项目根目录新建一个hooks文件夹,里面放你的通用pre-commit脚本(比如包含Kotlin/Java lint检查、资源文件校验等逻辑),并把这个文件夹加入版本控制,方便团队同步。批量同步hooks到所有子仓库
写一个Shell脚本,利用Repo的批量命令给所有子仓库创建hook的软链接:#!/bin/bash # 项目根目录 REPO_ROOT=$(pwd) # 统一hook存放目录 COMMON_HOOKS="$REPO_ROOT/hooks/pre-commit" # 遍历所有子仓库,创建软链接 repo list | while read repo_info; do repo_path=$(echo "$repo_info" | awk '{print $1}') target_hook="$repo_path/.git/hooks/pre-commit" if [ ! -f "$target_hook" ]; then ln -s "$COMMON_HOOKS" "$target_hook" chmod +x "$target_hook" echo "✅ 为 $repo_path 配置pre-commit hook完成" fi done运行这个脚本后,所有子仓库的pre-commit hook都会指向你统一维护的脚本,后续修改只需要更新根目录的脚本即可。
集成到Repo流程(可选)
可以把这个同步脚本加到repo sync的后续操作里,比如写一个自定义的sync脚本,先执行repo sync,再运行hook同步命令,确保新克隆或同步的子仓库都能自动配置好hook。
方法3:用repo forall快速批量配置
如果你不想写单独的脚本,也可以直接用Repo自带的repo forall命令一次性完成所有子仓库的hook配置:
repo forall -c 'ln -sf "$REPO_ROOT/hooks/pre-commit" .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit'
$REPO_ROOT是Repo内置的环境变量,会自动指向项目根目录,无需手动替换。
注意事项
- 执行权限:务必确保hook脚本有可执行权限(
chmod +x),否则Git会忽略这个hook。 - 性能优化:pre-commit hook的逻辑要尽量高效,比如只检查本次提交的文件(可以用
git diff --cached获取待提交文件列表),避免全仓库扫描导致提交卡顿。 - 团队协作:把统一的
hooks目录加入Git仓库,新成员克隆项目后只需运行一次同步脚本,就能拥有一致的hook配置。
其实Repo本身并没有限制Git原生hook的使用,只是官方文档没重点覆盖而已,借助Git的hook机制加上Repo的批量操作能力,完全可以实现你需要的pre-commit检查需求。
内容的提问来源于stack exchange,提问作者Verthais

