Git钩子脚本如何生成代码报告

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何生成代码报告

  1. 使用 pre-commit 钩子生成代码统计报告
  2. 使用 post-commit 钩子生成代码质量报告
  3. 使用 pre-push 钩子生成测试覆盖率报告
  4. 完整的钩子脚本框架
  5. 安装和使用
  6. 可选:生成HTML可视化报告

我来介绍几种通过Git钩子生成代码报告的方法:

使用 pre-commit 钩子生成代码统计报告

#!/bin/bash
# .git/hooks/pre-commit
# 生成代码行数统计报告
echo "📊 代码变更统计报告"
echo "==================="
# 统计变更的文件数量
CHANGED_FILES=$(git diff --cached --name-only | wc -l)
echo "变更文件数: $CHANGED_FILES"
# 统计代码行数变化
ADDITIONS=$(git diff --cached --numstat | awk '{add+=$1} END {print add}')
DELETIONS=$(git diff --cached --numstat | awk '{del+=$2} END {print del}')
echo "新增行数: $ADDITIONS"
echo "删除行数: $DELETIONS"
# 保存报告
REPORT_FILE="reports/commit_$(date +%Y%m%d_%H%M%S).txt"
mkdir -p reports
cat > "$REPORT_FILE" << EOF
Git Commit Report
=================
时间: $(date)
分支: $(git branch --show-current)
变更文件数: $CHANGED_FILES
新增行数: $ADDITIONS
删除行数: $DELETIONS
EOF
echo "报告已保存: $REPORT_FILE"

使用 post-commit 钩子生成代码质量报告

#!/bin/bash
# .git/hooks/post-commit
# 获取最后一条commit信息
LAST_COMMIT=$(git log -1 --pretty=format:"%H")
COMMIT_MSG=$(git log -1 --pretty=format:"%s")
echo "📝 生成代码质量报告..."
# PHP代码检查示例 (使用PHPMD)
if command -v phpmd &> /dev/null; then
    echo "运行PHP代码质量检查..."
    FILES=$(git diff-tree --no-commit-id -r --name-only HEAD | grep '\.php$')
    for FILE in $FILES; do
        if [ -f "$FILE" ]; then
            REPORT_FILE="reports/code_quality_$(date +%Y%m%d_%H%M%S).xml"
            phpmd "$FILE" xml codesize,unusedcode,naming > "$REPORT_FILE" 2>/dev/null
        fi
    done
fi
# JavaScript检查示例
if command -v eslint &> /dev/null; then
    echo "运行ESLint检查..."
    JS_FILES=$(git diff-tree --no-commit-id -r --name-only HEAD | grep '\.js$')
    for FILE in $JS_FILES; do
        if [ -f "$FILE" ]; then
            eslint "$FILE" --format json > "reports/eslint_$(date +%Y%m%d_%H%M%S).json" 2>/dev/null
        fi
    done
fi
echo "✅ 代码质量报告生成完成"

使用 pre-push 钩子生成测试覆盖率报告

#!/bin/bash
# .git/hooks/pre-push
echo "🧪 生成测试报告..."
REPORT_DIR="reports/test_reports"
mkdir -p "$REPORT_DIR"
# 运行测试并生成覆盖率报告
if [ -f "composer.json" ]; then
    echo "运行PHPUnit测试..."
    vendor/bin/phpunit --coverage-html "$REPORT_DIR/coverage" \
                       --coverage-clover "$REPORT_DIR/clover.xml" \
                       --log-junit "$REPORT_DIR/junit.xml"
fi
# 生成测试摘要报告
SUMMARY_FILE="$REPORT_DIR/test_summary.html"
cat > "$SUMMARY_FILE" << 'EOF'
<!DOCTYPE html>
<html>
<head><title>测试报告摘要</title></head>
<body>
<h1>测试报告摘要</h1>
<ul>
EOF
# 添加测试结果
if [ -f "$REPORT_DIR/junit.xml" ]; then
    TOTAL_TESTS=$(grep -c 'testcase' "$REPORT_DIR/junit.xml")
    FAILURES=$(grep -c 'failure' "$REPORT_DIR/junit.xml")
    echo "<li>总测试数: $TOTAL_TESTS</li>" >> "$SUMMARY_FILE"
    echo "<li>失败数: $FAILURES</li>" >> "$SUMMARY_FILE"
fi
echo "</ul></body></html>" >> "$SUMMARY_FILE"
echo "📊 测试报告已生成: test_summary.html"

完整的钩子脚本框架

#!/bin/bash
# .git/hooks/code_report.sh
set -e
# 配置
PROJECT_NAME="My Project"
REPORT_DIR="reports"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 函数:初始化报告
init_report() {
    mkdir -p "$REPORT_DIR/$TIMESTAMP"
    REPORT_FILE="$REPORT_DIR/$TIMESTAMP/summary.md"
    cat > "$REPORT_FILE" << EOF
# $PROJECT_NAME - 代码报告
## 基本信息
- **时间**: $(date '+%Y-%m-%d %H:%M:%S')
- **分支**: $(git branch --show-current)
- **作者**: $(git config user.name)
- **提交者**: $(git config user.email)
---
EOF
}
# 函数:添加代码统计
add_code_stats() {
    echo -e "\n## 代码统计" >> "$REPORT_FILE"
    echo -e "\n| 指标 | 数值 |" >> "$REPORT_FILE"
    echo -e "|------|------|" >> "$REPORT_FILE"
    # 总行数
    TOTAL_LINES=$(find . -name "*.php" -o -name "*.js" -o -name "*.py" | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}')
    echo "| 总代码行数 | $TOTAL_LINES |" >> "$REPORT_FILE"
    # 文件数
    FILE_COUNT=$(git ls-files -- '*.php' '*.js' '*.py' '*.html' '*.css' | wc -l)
    echo "| 文件总数 | $FILE_COUNT |" >> "$REPORT_FILE"
    # 当前变更
    CHANGED_FILES=$(git diff --cached --name-only | wc -l)
    echo "| 本次变更文件 | $CHANGED_FILES |" >> "$REPORT_FILE"
}
# 函数:添加代码规范检查
add_code_style_check() {
    echo -e "\n## 代码规范检查" >> "$REPORT_FILE"
    # PHP CS Fixer
    if command -v php-cs-fixer &> /dev/null; then
        echo -e "\n### PHP CS Fixer 结果" >> "$REPORT_FILE"
        php-cs-fixer fix --dry-run --diff --format=json . > "$REPORT_DIR/$TIMESTAMP/phpcs.json" 2>/dev/null
        FIXER_VIOLATIONS=$(jq '.files | length' "$REPORT_DIR/$TIMESTAMP/phpcs.json")
        echo "发现 $FIXER_VIOLATIONS 个问题" >> "$REPORT_FILE"
    fi
}
# 主流程
echo "🔍 开始生成代码报告..."
init_report
add_code_stats
add_code_style_check
echo "✅ 报告已生成: $REPORT_FILE"

安装和使用

# 1. 创建钩子目录(如果不存在)
mkdir -p .git/hooks
# 2. 创建钩子脚本
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
# 在这里粘贴你的钩子脚本
EOF
# 3. 添加执行权限
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/post-commit
chmod +x .git/hooks/pre-push
# 4. 创建报告目录
mkdir -p reports
# 5. 添加 .gitignore 配置
echo "reports/" >> .gitignore

可选:生成HTML可视化报告

#!/bin/bash
# generate_html_report.sh
create_html_report() {
    local report_file="$1"
    cat > "${report_file%.md}.html" << EOF
<!DOCTYPE html>
<html>
<head>代码报告</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        .container { max-width: 800px; margin: auto; }
        .header { background: #f0f0f0; padding: 20px; border-radius: 5px; }
        .metric { display: inline-block; margin: 10px; padding: 20px; 
                 background: #e0e0e0; border-radius: 5px; text-align: center; }
        .metric-value { font-size: 24px; font-weight: bold; color: #333; }
        .metric-label { font-size: 14px; color: #666; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>代码质量报告</h1>
            <p>生成时间: $(date)</p>
        </div>
        <div class="metrics">
            <div class="metric">
                <div class="metric-value">$(git ls-files | wc -l)</div>
                <div class="metric-label">总文件数</div>
            </div>
            <div class="metric">
                <div class="metric-value">$(git log --oneline | wc -l)</div>
                <div class="metric-label">总提交数</div>
            </div>
            <div class="metric">
                <div class="metric-value">$(git branch | wc -l)</div>
                <div class="metric-label">分支数</div>
            </div>
        </div>
    </div>
</body>
</html>
EOF
}

这些钩子脚本可以根据你的具体需求进行调整和扩展,记住要添加执行权限并根据项目特点定制检查内容。

抱歉,评论功能暂时关闭!