本文目录导读:

是的,有多种实用脚本可以自动生成变更日志,以下是一些主流解决方案:
基于 Git 提交的常用工具
Standard Version (推荐)
# 安装 npm install -g standard-version # 自动生成变更日志 standard-version # 只生成 changelog,不创建 tag standard-version --dry-run
conventional-changelog-cli
# 安装 npm install -g conventional-changelog-cli # 生成 changelog conventional-changelog -p angular -i CHANGELOG.md -s -r 0 # 增量生成 conventional-changelog -p angular -i CHANGELOG.md -s
Git 自动化脚本示例
#!/bin/bash
# auto-changelog.sh
# 基于提交信息生成 changelog
git log --pretty=format:"- %s (%h)" --since="1 month ago" > CHANGELOG.md
# 分类提交
git log --pretty=format:"%s" | while read line; do
if [[ $line =~ ^feat ]]; then
echo "## 新功能" >> CHANGELOG.md
echo "- $line" >> CHANGELOG.md
elif [[ $line =~ ^fix ]]; then
echo "## Bug 修复" >> CHANGELOG.md
echo "- $line" >> CHANGELOG.md
fi
done
Python 脚本示例
# auto_changelog.py
import subprocess
import re
from datetime import datetime
def generate_changelog():
# 获取 git 提交记录
result = subprocess.run(
['git', 'log', '--oneline', '--since=1 month ago'],
capture_output=True, text=True
)
commits = result.stdout.split('\n')
changelog = f"# Changelog\n\n## {datetime.now().strftime('%Y-%m-%d')}\n\n"
categories = {
'feat': '🚀 新功能',
'fix': '🐛 Bug 修复',
'docs': '📝 文档更新',
'refactor': '🔧 代码重构',
'test': '✅ 测试'
}
for category, title in categories.items():
items = [c for c in commits if c.startswith(category)]
if items:
changelog += f"### {title}\n\n"
for item in items:
changelog += f"- {item[item.find(':')+1:].strip()}\n"
changelog += "\n"
# 写入文件
with open('CHANGELOG.md', 'w') as f:
f.write(changelog)
if __name__ == '__main__':
generate_changelog()
Node.js 脚本
// changelog-generator.mjs
import { execSync } from 'child_process';
import { writeFileSync } from 'fs';
function generateChangelog() {
const commits = execSync('git log --oneline --since="1 month ago"')
.toString()
.trim()
.split('\n');
const changelog = {
'feat': '✨ 新功能',
'fix': '🐛 修复',
'docs': '📖 文档',
'refactor': '♻️ 重构',
'chore': '🔧 杂项'
};
let content = `# 更新日志\n\n## ${new Date().toISOString().split('T')[0]}\n\n`;
Object.entries(changelog).forEach(([prefix, title]) => {
const items = commits
.filter(c => c.startsWith(prefix))
.map(c => `- ${c.substring(c.indexOf(':') + 1).trim()}`);
if (items.length > 0) {
content += `### ${title}\n\n${items.join('\n')}\n\n`;
}
});
writeFileSync('CHANGELOG.md', content);
console.log('✅ 更新日志已生成!');
}
generateChangelog();
集成到开发流程中
Git hooks (pre-commit)
# .git/hooks/pre-commit #!/bin/bash # 在提交时自动更新 changelog node changelog-generator.mjs git add CHANGELOG.md
CI/CD 配置 (GitHub Actions)
# .github/workflows/changelog.yml
name: Generate Changelog
on:
push:
tags:
- 'v*'
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Generate changelog
run: npx conventional-changelog-cli -p angular -i CHANGELOG.md -s
- name: Commit changelog
run: |
git config user.name github-actions
git config user.email github-actions@github.com
git add CHANGELOG.md
git commit -m "docs: update changelog"
git push
最佳实践建议
提交信息规范
确保使用标准化的 commit 格式:
<type>(<scope>): <subject>
feat: 添加新功能
fix: 修复 bug
docs: 更新文档
refactor: 重构代码
test: 添加测试
chore: 维护工作
推荐工具选择
- 小型项目:直接使用 git log 脚本
- 中大型项目:standard-version 或 conventional-changelog
- 全自动化:集成到 CI/CD 流程
选择哪种方式取决于你的项目规模、团队的 commit 规范程度以及自动化需求。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播