本文目录导读:

是的,脚本可以自动设置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钩子配置,提高代码质量和开发效率。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播