本文目录导读:

是的,脚本可以自动设置Git钩子,以下是几种常见的方法:
使用Shell脚本
#!/bin/bash # 创建钩子目录 HOOKS_DIR=".git/hooks" mkdir -p "$HOOKS_DIR" # 创建pre-commit钩子 cat > "$HOOKS_DIR/pre-commit" << 'EOF' #!/bin/bash echo "运行 pre-commit 检查..." # 添加你的检查逻辑 npm run lint EOF # 赋予执行权限 chmod +x "$HOOKS_DIR/pre-commit" echo "Git钩子设置完成!"
使用Node.js脚本
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const hooksDir = path.join(process.cwd(), '.git', 'hooks');
const hookContent = `#!/bin/bash
echo "运行 pre-commit 钩子..."
# 自定义逻辑
`;
// 确保目录存在
if (!fs.existsSync(hooksDir)) {
fs.mkdirSync(hooksDir, { recursive: true });
}
// 写入钩子文件
fs.writeFileSync(
path.join(hooksDir, 'pre-commit'),
hookContent
);
// 赋予执行权限 (Unix/Linux/Mac)
fs.chmodSync(path.join(hooksDir, 'pre-commit'), '755');
console.log('Git钩子设置完成!');
使用自动化工具
husky (推荐)
# 安装 husky npm install husky --save-dev # 初始化 husky npx husky install # 创建钩子 npx husky add .husky/pre-commit "npm test"
pre-commit (Python)
# .pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
# 安装并运行 pip install pre-commit pre-commit install
企业级自动化脚本
#!/bin/bash
setup_git_hooks() {
local project_dir="${1:-.}"
local hooks_dir="$project_dir/.git/hooks"
# 检查是否是git仓库
if [ ! -d "$project_dir/.git" ]; then
echo "错误:不是Git仓库"
exit 1
}
# 备份现有钩子
if [ -f "$hooks_dir/pre-commit" ]; then
mv "$hooks_dir/pre-commit" "$hooks_dir/pre-commit.backup.$(date +%Y%m%d)"
fi
# 创建新的pre-commit钩子
cat > "$hooks_dir/pre-commit" << 'HOOK'
#!/bin/bash
echo "=== 自动化检查开始 ==="
# 1. 代码格式化检查
if command -v prettier &> /dev/null; then
echo "检查代码格式..."
npx prettier --check .
fi
# 2. ESLint检查
if [ -f "package.json" ]; then
echo "运行ESLint..."
npx eslint .
fi
# 3. 运行测试
if [ -f "package.json" ]; then
echo "运行测试..."
npm test
fi
echo "=== 检查完成 ==="
HOOK
chmod +x "$hooks_dir/pre-commit"
echo "✓ pre-commit钩子设置完成"
# 设置其他常用钩子
setup_commit_msg "$hooks_dir"
setup_pre_push "$hooks_dir"
}
setup_commit_msg() {
cat > "$1/commit-msg" << 'HOOK'
#!/bin/bash
# 检查提交信息格式
commit_msg=$(cat "$1")
if [[ ! $commit_msg =~ ^(feat|fix|docs|style|refactor|test|chore):.*$ ]]; then
echo "错误:提交信息格式不正确"
echo "正确格式: type: message"
echo "类型: feat|fix|docs|style|refactor|test|chore"
exit 1
fi
HOOK
chmod +x "$1/commit-msg"
}
setup_pre_push() {
cat > "$1/pre-push" << 'HOOK'
#!/bin/bash
echo "运行推前检查..."
# 确保所有测试通过
npm test
HOOK
chmod +x "$1/pre-push"
}
# 使用示例
setup_git_hooks "/path/to/your/project"
跨平台解决方案
#!/usr/bin/env python3
import os
import stat
import sys
def setup_git_hooks(project_path="."):
hooks_dir = os.path.join(project_path, ".git", "hooks")
if not os.path.exists(hooks_dir):
print("错误:不是Git仓库")
sys.exit(1)
hooks = {
"pre-commit": """#!/bin/bash
echo "Running pre-commit hooks..."
# Add your checks here
""",
"pre-push": """#!/bin/bash
echo "Running pre-push checks..."
# Add your checks here
"""
}
for hook_name, content in hooks.items():
hook_path = os.path.join(hooks_dir, hook_name)
# 写入文件
with open(hook_path, 'w') as f:
f.write(content)
# 设置执行权限
st = os.stat(hook_path)
os.chmod(hook_path, st.st_mode | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
print(f"✓ 已设置 {hook_name} 钩子")
if __name__ == "__main__":
setup_git_hooks()
最佳实践建议
- 使用版本控制:将钩子脚本放在项目源码中
- 自动化初始化:在
npm postinstall或setup.py中自动设置 - 提供跳过选项:允许开发者使用
--no-verify跳过验证 - 检查依赖:确保所需工具已安装
- 错误处理:提供清晰错误信息和退出代码
示例:package.json配置
{
"scripts": {
"postinstall": "node scripts/setup-hooks.js",
"setup-hooks": "node scripts/setup-hooks.js"
}
}
这样的自动化脚本可以确保团队所有成员都使用相同的Git钩子配置,提高代码质量和开发效率。