install-hooks.sh 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env bash
  2. #
  3. # 安装 / 卸载 git hooks:
  4. # ./scripts/install-hooks.sh # 安装
  5. # ./scripts/install-hooks.sh --uninstall # 卸载
  6. #
  7. # 安装后:
  8. # - pre-commit:检测到核心业务文件改动就自动跑核心业务测试
  9. # - pre-push :每次 push 前强制跑一次完整核心业务测试
  10. set -e
  11. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  12. ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
  13. cd "$ROOT_DIR"
  14. ACTION="${1:-install}"
  15. case "$ACTION" in
  16. --uninstall|uninstall|-u)
  17. echo "🗑 卸载 hooks..."
  18. rm -f ".git/hooks/pre-commit"
  19. rm -f ".git/hooks/pre-push"
  20. echo " ✅ 已卸载"
  21. exit 0
  22. ;;
  23. install|"")
  24. echo "⚙️ 安装 git hooks..."
  25. # 检查仓库根
  26. if [ ! -d ".git" ]; then
  27. echo " ❌ 当前目录不是 git 仓库"
  28. exit 1
  29. fi
  30. # 安装 pre-commit
  31. if [ -f ".githooks/pre-commit" ]; then
  32. cp ".githooks/pre-commit" ".git/hooks/pre-commit"
  33. chmod +x ".git/hooks/pre-commit"
  34. echo " ✅ pre-commit 已安装(核心业务改动自动跑测试)"
  35. else
  36. echo " ❌ 缺少 .githooks/pre-commit"
  37. exit 1
  38. fi
  39. # 安装 pre-push
  40. if [ -f ".githooks/pre-push" ]; then
  41. cp ".githooks/pre-push" ".git/hooks/pre-push"
  42. chmod +x ".git/hooks/pre-push"
  43. echo " ✅ pre-push 已安装(推送前强制跑测试)"
  44. else
  45. echo " ❌ 缺少 .githooks/pre-push"
  46. exit 1
  47. fi
  48. echo
  49. echo "🎉 hooks 安装完成。"
  50. echo
  51. echo "今后执行 git commit / git push 时会按 CONTRIBUTING.md 规则自动跑核心业务测试。"
  52. echo "紧急绕过:git commit --no-verify / git push --no-verify(请在 PR 描述里说明原因)"
  53. echo
  54. echo "查看已装的 hooks:"
  55. echo " ls -la .git/hooks/pre-*"
  56. ;;
  57. *)
  58. echo "用法: $0 [--uninstall]"
  59. exit 1
  60. ;;
  61. esac