本文目录导读:

- 使用 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
}
这些钩子脚本可以根据你的具体需求进行调整和扩展,记住要添加执行权限并根据项目特点定制检查内容。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播