UNPKG

@tomiaa/git-gz

Version:

Install husky hooks and project templates for gz-commit checks

287 lines (198 loc) 6.58 kB
# @tomiaa/git-gz Git 分支与提交管理工具,提供分支合并、推送规则校验,以及中文化的 commitlint 提示。 ## 功能特性 - ✅ **合并规则校验**:阻止不允许的分支合并操作(支持 Fast-forward 和非 Fast-forward) - ✅ **推送规则校验**:保护特定分支不被直接推送、校验分支命名规范 - ✅ **中文化提示**:commitlint 错误信息自动翻译为中文 - ✅ **灵活配置**:通过 `gz-commit.config.js` 自定义规则 ## 快速开始 ### 1. 安装依赖 首先,确保项目中安装了必要的依赖: ```bash npm install --save-dev @tomiaa/git-gz husky@^8.0.0 commitlint@^17 @commitlint/config-conventional@^17 ``` 或者使用 yarn: ```bash yarn add --dev @tomiaa/git-gz husky@^8.0.0 commitlint@^17 @commitlint/config-conventional@^17 ``` ### 2. 自动初始化 安装后会自动执行初始化,包括: - 初始化 husky(如果尚未初始化) - 创建 Git hooks(post-merge、pre-push、commit-msg) - 生成配置文件模板 `gz-commit.config.js`(如果不存在) ### 3. 配置 根据项目需求修改 `gz-commit.config.js``commitlint.config.js`### 4. 使用 CLI 命令 安装后可以使用以下命令: ```bash # 初始化(通常自动完成,手动执行用于 npm link 场景) npx git-gz init # 查看帮助 npx git-gz --help # 查看版本 npx git-gz --version ``` 如果希望使用 `git gz` 格式的命令,可以全局安装: ```bash npm install -g @tomiaa/git-gz@beta git gz --help ``` ## 安装 ### 正常安装 ```bash npm install @tomiaa/git-gz --save-dev # 或 yarn add @tomiaa/git-gz --dev ``` ### 使用 npm link 开发 如果使用 `npm link` 进行本地开发,需要手动运行初始化命令: ```bash npm link @tomiaa/git-gz npx git-gz init ``` ## 配置文件 初始化后会在项目根目录生成 `gz-commit.config.js`(如果不存在): ```javascript // gz-commit.config.js module.exports = { // 不能被直接 push 的目标分支 forbidDirectPush: ["release", "main"], // 允许的分支名前缀 allowedBranchPrefixes: ["feat/", "hotfix/", "bugfix/", "fix/"], // 禁止合并规则 forbidMerges: [ { from: ["sit"], to: [/.*/], msg: "不允许从 sit 分支合并到任何分支" }, { from: ["uat", "gray"], to: [/^((?!.*(uat|gray)$).*)$/], msg: "从 uat/gray 分支合并时,目标分支必须以 uat/gray 结尾" }, ], // 环境分支列表(这些分支本身不受限制) envBranches: ["sit", "uat", "gray", "release"], // 提示信息前缀 messagePrefix: "[git gz] ", }; ``` ## 使用说明 ### 合并规则 ```bash # 当前在 release 分支 git merge sit # ❌ [git gz] 拒绝合并:不允许从 sit 分支合并到当前分支 # 自动回滚合并操作 ``` ### 推送规则 ```bash # 当前在 feat/new-feature 分支 git push origin release # ❌ [git gz] 拒绝推送:禁止直接 push 到受保护分支 'release'。请使用 PR 流程。 # 推送不符合命名规范的分支 git checkout -b test git push origin test # ❌ [git gz] 拒绝推送:当前分支 "test" 不符合命名规范,必须以 feat/, hotfix/, bugfix/, fix/ 开头 ``` ### Commit 信息校验 使用 commitlint 校验 commit 信息,错误提示自动翻译为中文: ```bash git commit -m "test" # ❌ 提交类型(type)不能为空 git commit -m "feat: 添加新功能" # ✅ 成功提交 ``` ## 环境变量 ### 跳过自动初始化 ```bash # 设置此环境变量可跳过 postinstall 自动初始化 export GZ_COMMIT_SKIP_SETUP=1 npm install @tomiaa/git-gz --save-dev ``` ## CLI 命令 安装后可以通过以下方式使用: ```bash # 方式 1: 使用 npx(推荐,适用于本地安装) npx git-gz init npx git-gz --help npx git-gz --version # 方式 2: 使用 git 子命令(需要全局安装或在 npm scripts 中) git gz init git gz --help git gz --version ``` ### 全局安装(可选) 如果想在任何地方直接使用 `git gz` 命令,可以全局安装: ```bash npm install -g @tomiaa/git-gz@beta # 然后可以在任何目录使用 git gz --help ``` ## Git Hooks 该工具会自动创建以下 Git hooks: - **post-merge**:检查合并操作是否违反规则,违反则自动回滚 - **pre-push**:检查推送操作是否违反规则 - **commit-msg**:校验 commit 信息格式,并提供中文错误提示 ## 注意事项 1. **Fast-forward 合并**:使用 `post-merge` hook 来处理,因为 `pre-merge-commit` 无法拦截 Fast-forward 合并 2. **备份机制**:初始化时如果 hook 已存在,会自动备份为 `.bak-timestamp` 文件 ## 依赖要求 需要在项目中安装以下 peer dependencies: ```json { "commitlint": ">=17", "@commitlint/config-conventional": "^17.0.0", "commitizen": "^4.3.1", "husky": ">=8.0.0" } ``` **注意**: - 同时支持 husky v8v9+,安装脚本会自动检测版本并生成对应格式的 hook 文件 - 如果项目中尚未安装 husky,安装脚本会自动执行 `npx husky install` 进行初始化 ## 卸载 删除生成的 hooks 文件即可: ```bash rm .husky/post-merge .husky/pre-push .husky/commit-msg ``` 如果有备份文件,可以恢复: ```bash mv .husky/post-merge.bak-* .husky/post-merge ``` ## 常见问题 ### 为什么无法使用 `git gz` 命令? **本地安装(推荐)**: - 使用 `npx git-gz` 命令 - 这是最可靠的方式,适用于所有场景 **全局安装**: - 如果全局安装了包(`npm install -g @tomiaa/git-gz@beta`) - 可以直接使用 `git gz``git-gz` 命令 - Git 会自动识别 PATH 中的 `git-gz` 命令作为 `git gz` 子命令 **在 npm scripts 中**: - 可以直接使用 `git-gz`,因为 npm scripts 会自动将 `node_modules/.bin` 添加到 PATH ```json { "scripts": { "setup": "git-gz init" } } ``` ### husky 初始化失败怎么办? 如果自动初始化失败,请手动执行: ```bash npx husky install ``` 然后重新运行: ```bash npx git-gz init ``` ### 如何确认 husky 版本兼容性? 本工具同时支持 husky v8v9+: - **husky v8**:hook 文件包含 shebang 和 `husky.sh` 引用 - **husky v9+**:hook 文件只包含命令本身,不需要 shebang 安装时会自动检测 husky 版本并生成对应格式的 hook 文件。如果遇到 "DEPRECATED" 警告,重新运行 `npx git-gz init` 即可更新为正确格式。 ## 许可证 MIT ## 贡献 欢迎提交 Issue 和 Pull Request!