本文目录导读:

- 使用 pre-commit 钩子生成代码统计报告
- 使用 post-commit 钩子生成代码质量报告
- 使用 pre-push 钩子生成测试覆盖率报告
- 完整的钩子脚本框架
- 安装和使用
- 可选:生成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
}
这些钩子脚本可以根据你的具体需求进行调整和扩展,记住要添加执行权限并根据项目特点定制检查内容。