脚本能自动设置Git钩子吗?

wen 实用脚本 1

本文目录导读:

脚本能自动设置Git钩子吗?

  1. 使用Shell脚本
  2. 使用Node.js脚本
  3. 使用自动化工具
  4. 企业级自动化脚本
  5. 跨平台解决方案
  6. 最佳实践建议
  7. 示例:package.json配置

是的,脚本可以自动设置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()

最佳实践建议

  1. 使用版本控制:将钩子脚本放在项目源码中
  2. 自动化初始化:在npm postinstallsetup.py中自动设置
  3. 提供跳过选项:允许开发者使用--no-verify跳过验证
  4. 检查依赖:确保所需工具已安装
  5. 错误处理:提供清晰错误信息和退出代码

示例:package.json配置

{
  "scripts": {
    "postinstall": "node scripts/setup-hooks.js",
    "setup-hooks": "node scripts/setup-hooks.js"
  }
}

这样的自动化脚本可以确保团队所有成员都使用相同的Git钩子配置,提高代码质量和开发效率。

抱歉,评论功能暂时关闭!