预提交钩子中的阶段变更 | AI生成和翻译

Home 2025.07

若要在预提交钩子中将 update_notes_link.py 脚本的更改整合到当前提交(而非创建独立提交),需修改钩子逻辑:仅暂存更新文件而不单独提交。这样 Python 脚本的更改就会包含在用户的提交中。以下是修改后的预提交钩子脚本实现方案。

核心调整

预提交钩子脚本

#!/bin/bash

# 运行 update_notes_link.py 脚本并捕获输出
OUTPUT=$(python scripts/generate/update_notes_link.py 2>&1)
EXIT_CODE=$?

# 检查 Python 脚本执行状态
if [ $EXIT_CODE -ne 0 ]; then
    echo "错误:update_notes_link.py 执行失败,退出码 $EXIT_CODE"
    echo "$OUTPUT"
    exit 1
fi

# 检查目标文件是否被更新
if echo "$OUTPUT" | grep -q "Updated original/2025-01-11-notes-en.md"; then
    echo "笔记链接已更新,正在为当前提交暂存更改"

    # 暂存相关文件
    git add original/2025-01-11-notes-en.md
    git add _posts/en/*.md

    # 验证文件暂存状态
    if ! git diff --cached --quiet; then
        echo "更改已成功暂存"
    else
        echo "暂无需要暂存的更改"
    fi
else
    echo "original/2025-01-11-notes-en.md 无更新,无需暂存附加文件"
fi

# 正常退出以继续提交流程
exit 0

脚本逻辑解析

钩子配置流程

  1. 创建钩子文件
    • 将脚本保存至仓库的 .git/hooks/pre-commit
  2. 设置可执行权限
    chmod +x .git/hooks/pre-commit
    
  3. 测试验证
    • 修改文件或确保 Python 脚本会更新 original/2025-01-11-notes-en.md
    • 执行 git commit -m "提交说明"
    • 通过 git diff --cached(提交前)或 git show(提交后)验证更新文件是否已包含

使用 pre-commit 框架(可选方案)

若倾向使用 pre-commit 框架,可通过 .pre-commit-config.yaml 实现相同逻辑:

  1. 安装框架
    pip install pre-commit
    
  2. 创建配置文件
repos:
- repo: local
  hooks:
  - id: update-notes-links
    name: 更新笔记链接
    entry: bash -c '
      OUTPUT=$(python scripts/generate/update_notes_link.py 2>&1);
      EXIT_CODE=$?;
      if [ $EXIT_CODE -ne 0 ]; then
        echo "错误:update_notes_link.py 执行失败,退出码 $EXIT_CODE";
        echo "$OUTPUT";
        exit 1;
      fi;
      if echo "$OUTPUT" | grep -q "Updated original/2025-01-11-notes-en.md"; then
        echo "笔记链接已更新,正在为当前提交暂存更改";
        git add original/2025-01-11-notes-en.md;
        git add _posts/en/*.md;
        if ! git diff --cached --quiet; then
          echo "更改已成功暂存";
        else
          echo "暂无需要暂存的更改";
        fi;
      else
        echo "original/2025-01-11-notes-en.md 无更新,无需暂存附加文件";
      fi'
    language: script
    files: ^(original/2025-01-11-notes-en\.md|_posts/en/.*\.md)$
    stages: [commit]
  1. 安装钩子
    pre-commit install
    
  2. 功能测试
    • 提交匹配 files 正则表达式的文件变更(如 original/2025-01-11-notes-en.md_posts/en/*.md
    • 确认钩子正常执行,必要时暂存更改并包含至提交

与原 GitHub Actions 的差异

注意事项

验证步骤

  1. 修改文件或触发 Python 脚本更新 original/2025-01-11-notes-en.md
  2. 执行 git commit -m "测试提交"
  3. 运行 git show 确认更新文件已包含至提交且保留原提交信息
  4. 确认未产生额外提交(如 chore(notes): Update notes links 类提交)

如需进一步调整(如特定错误处理或扩展暂存文件范围),可随时提出优化需求!


Back Donate