Git Hooks + 定时任务:把 Claude Code 嵌入任何自动化流程
前三篇解决了"怎么调"和"怎么串"。这一篇解决"什么时候调"------让 Claude Code 自动在你需要的时候触发。
先澄清:Claude Code Hook ≠ Git Hook
这两个是完全不同的东西,只是都叫 "Hook":
| Claude Code Hook | Git Hook | |
|---|---|---|
| 配置文件 | .claude/settings.json |
.git/hooks/<事件名> |
| 谁触发 | Claude Code 执行工具时 | 你执行 git commit 时 |
| 管什么 | Claude 的 Edit/Bash 行为 | git 的操作流程 |
Git Hook 不看是谁调了 git commit,只看 git commit 有没有被执行。 你在 Claude Code 交互模式里说"帮我提交",Claude 在后台跑 git commit------Git Hook 一样触发。
实战一:提交前自动类型检查
创建 .git/hooks/pre-commit:
bash
#!/bin/bash
echo "🔍 TypeScript 类型检查..."
cd ~/my-project
npx tsc --noEmit 2>&1
if [ $? -ne 0 ]; then
echo "❌ 类型检查未通过,提交已阻止"
exit 1
fi
echo "✅ 通过"
exit 0
bash
chmod +x .git/hooks/pre-commit
之后每次 git commit,无论你手动敲还是 Claude 代劳,都会先跑检查。不通过就阻止。
如果想更智能------不用固定脚本,而是让 Claude 判断结果:
bash
#!/bin/bash
result=$(cd ~/my-project && \
claude -p "运行 npx tsc --noEmit,输出 JSON:{errors: 错误数}。只输出 JSON。" \
--allowed-tools "Bash" --model haiku --max-turns 1)
errors=$(echo "$result" | jq -r '.errors')
if [ "$errors" -ne 0 ]; then
echo "❌ $errors 个类型错误,提交已阻止"
exit 1
fi
exit 0
实战二:AI 自动写 commit message
创建 .git/hooks/prepare-commit-msg:
bash
#!/bin/bash
# 只在用户没有手动写 message 时触发
if [ "$2" = "" ]; then
echo "🤖 AI 正在生成 commit message..."
git diff --cached --stat | \
claude -p "根据上面的变更生成英文 commit message。格式 type(scope): 描述,不超过 72 字符。只输出 message。" \
--allowed-tools "Read" --model haiku > "$1"
echo "✅ 已生成"
fi
之后直接 git commit(不带 -m),Claude 自动帮你写。
三条底线
.git/hooks/不会被 git 跟踪,换电脑要重新配置- 紧急跳过:
git commit --no-verify - 删掉对应文件 = 关闭 Hook
实战三:定时任务(系统 cron + Headless)
每天自动搜 AI 热点,整理到你本地文档。
第一步:写脚本
bash
#!/bin/bash
# ~/scripts/daily-ai-brief.sh
claude -p "搜索过去 24 小时最重要的 AI 新闻(5 条以内),每条 100 字中文摘要,保存到 ~/Documents/daily-ai-brief.md。如果文件已存在,追加到 # $(date +%Y-%m-%d) AI 早报 标题下。" \
--allowed-tools "WebSearch,WebFetch,Write,Read" \
>> /tmp/claude-cron.log 2>&1
bash
chmod +x ~/scripts/daily-ai-brief.sh
# 先手动跑一次确认没问题:
~/scripts/daily-ai-brief.sh
第二步:配置 cron
crontab -e
加入:
bash
# 每天早上 9:07(不选整点,避开 cron 执行高峰)
7 9 * * * /bin/bash /Users/geek/scripts/daily-ai-brief.sh
为什么要用独立脚本,而不是直接把命令写在 crontab 里? crontab 中 % 是换行符,$(date +%Y-%m-%d) 里的 % 会破坏命令。写成 .sh 文件避免了这个问题,也方便单独测试。
确认配置生效:
crontab -l
实战四:批量处理 + 自动修复
bash
#!/bin/bash
# 遍历所有数据文件,批量生成视频
DATA_DIR="~/project/src/data"
LOG="/tmp/video-batch.log"
for file in "$DATA_DIR"/*.ts; do
name=$(basename "$file" .ts)
echo "[$(date +%H:%M:%S)] 生成 $name ..." | tee -a "$LOG"
(cd ~/project && \
claude -p "用 $file 生成横版和竖版视频。完成后输出 JSON:{name: $name, files: [路径]}。" \
--allowed-tools "Bash,Read,Write,Edit") >> "$LOG" 2>&1
done
编译 + 自动修复:
bash
#!/bin/bash
DIR="~/my-project"
result=$(cd "$DIR" && \
claude -p "运行 npx tsc --noEmit,输出 JSON:{errors: 错误数}。只输出 JSON。" \
--allowed-tools "Bash" --model haiku --max-turns 1)
errors=$(echo "$result" | jq -r '.errors')
if [ "$errors" -eq 0 ]; then
echo "✅ 通过"
exit 0
fi
echo "❌ $errors 个错误,自动修复中..."
claude -p "上面 tsc 输出了 $errors 个编译错误。逐一修复所有类型错误,不修改业务逻辑。" \
--allowed-tools "Edit,Read,Bash" --continue --max-turns 5
echo "修复完成,重新检查..."
速查表
bash
# 喂数据给 Claude
命令 | claude -p "对这个数据做什么" --allowed-tools "..."
# 拿数据出来
claude -p "..." --output-format json | jq '.key'
# 两头都接
数据命令 | claude -p "..." --allowed-tools "..." | 消费命令
# Git Hook 模板
.git/hooks/pre-commit + Headless = 提交前自动检查
# Cron 模板
crontab + .sh 脚本 + Headless = 定时自动化
练习建议
按以下顺序,10 分钟之内全部跑通:
claude -p "一句话解释 TypeScript" --model haikuclaude -p "读取 package.json,统计依赖数量" --allowed-tools "Read"ls src/ | claude -p "分析这些文件名" --model haiku- 写一个
.sh脚本,加上#!/bin/bash和chmod +x,跑通
五步走完,Headless 的核心用法就全掌握了。后续按需查阅各篇详细说明。
系列结束。四篇涵盖了 Headless 模式从入门到自动化嵌入的全部内容。