合并至master分支时无法触发自定义版本升级脚本的问题
合并至master分支时自动触发版本升级脚本失败的问题
背景与需求
我有如下package.json配置:
{ "name": "@ellakcy/fa-checkbox", "author": "Cypriot Free Software Foundation", "license": "MIT", "version": "0.0.11", "description": "CSS and SASS lib that shows beautiful checkboxes using fontawesome", "main": "index.html", "keywords": [ "css", "checkbox", "fontawesome" ], "scripts": { "start": "npm-run-all --parallel watch-css start-server", "watch-css": "sass --watch scss:dev", "start-server": "live-server", "sass": "sass scss:dist", "prepare": "husky install", "version": "echo $npm_package_version", "bump-version": "node scripts/bump-version.mjs", "postinstall": "husky install" }, "husky": { "hooks": { "prepare-commit-msg": "npm run bump-version && git add package.json && git add package-lock.json" } }, "devDependencies": { "husky": "^8.0.3", "inquirer": "^9.2.13", "live-server": "^1.2.2", "npm-run-all": "^4.1.5", "sass": "^1.69.7" } }
我希望合并代码到master分支时,自动运行以下自定义版本升级脚本(手动执行npm run bump-version可正常工作):
import inquirer from 'inquirer'; import * as fs from 'fs'; import semver from 'semver'; async function getVersionBumpChoices(currentVersion) { const versionChoices = ['patch', 'minor', 'major']; const messages = { 'patch': "Patch (Bug fixes)", 'minor': "Minor (New features)", 'major': "Major (Breaking changes)" }; // 基于当前版本生成带自定义说明的选项 const choices = versionChoices.map((bumpType) => { const bumpedVersion = semver.inc(currentVersion, bumpType); return { name: `${messages[bumpType]} -> ${bumpedVersion}`, value: bumpedVersion, }; }); return choices; } async function bumpVersion() { // 读取package.json const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8')); console.log(`Current version ${packageJson.version}`); const choices = await getVersionBumpChoices(packageJson.version); // 询问用户选择版本类型 const { versionType } = await inquirer.prompt([ { type: 'list', name: 'versionType', message: 'Select the version bump type:', choices: choices, }, ]); // 更新版本号 packageJson.version = versionType; // 写入更新后的package.json fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2)); console.log(`Version bumped to ${versionType}`); } bumpVersion();
问题现象
执行git checkout master和git merge dev时,脚本并未自动触发。查看.git/hooks/目录,发现husky未安装post-merge钩子:
ls -l .git/hooks/ σύνολο 60 -rwxrwxr-x 1 pcmagas pcmagas 478 Ιαν 16 21:48 applypatch-msg.sample -rwxrwxr-x 1 pcmagas pcmagas 896 Ιαν 16 21:48 commit-msg.sample -rwxrwxr-x 1 pcmagas pcmagas 4655 Ιαν 16 21:48 fsmonitor-watchman.sample -rwxrwxr-x 1 pcmagas pcmagas 189 Ιαν 16 21:48 post-update.sample -rwxrwxr-x 1 pcmagas pcmagas 424 Ιαν 16 21:48 pre-applypatch.sample -rwxrwxr-x 1 pcmagas pcmagas 1643 Ιαν 16 21:48 pre-commit.sample -rwxrwxr-x 1 pcmagas pcmagas 416 Ιαν 16 21:48 pre-merge-commit.sample -rwxrwxr-x 1 pcmagas pcmagas 1492 Ιαν 16 21:48 prepare-commit-msg.sample -rwxrwxr-x 1 pcmagas pcmagas 1374 Ιαν 16 21:48 pre-push.sample -rwxrwxr-x 1 pcmagas pcmagas 4898 Ιαν 16 21:48 pre-rebase.sample -rwxrwxr-x 1 pcmagas pcmagas 544 Ιαν 16 21:48 pre-receive.sample -rwxrwxr-x 1 pcmagas pcmagas 2783 Ιαν 16 21:48 push-to-checkout.sample -rwxrwxr-x 1 pcmagas pcmagas 3650 Ιαν 16 21:48 update.sample
已尝试的操作
- 执行
npx husky install,提示钩子已安装,但合并时仍无效:
$ npx husky install husky - Git hooks installed pcmagas@pcmagas-System-Product-Name:~/Kwdikas/HTML5/fa-checkbox$ git commit -am "Remove spaces" README.md fatal: paths 'README.md ...' with -a does not make sense pcmagas@pcmagas-System-Product-Name:~/Kwdikas/HTML5/fa-checkbox$ git commit -m "Remove spaces" README.md [dev 1db5fe2] Remove spaces 1 file changed, 2 deletions(-) pcmagas@pcmagas-System-Product-Name:~/Kwdikas/HTML5/fa-checkbox$ git checkout master Αλλαγή στον κλάδο 'master' pcmagas@pcmagas-System-Product-Name:~/Kwdikas/HTML5/fa-checkbox$ git merge dev Updating a8d7a6c..1db5fe2 Fast-forward README.md | 2 -- 1 file changed, 2 deletions(-)
- 修改husky钩子配置为
pre-merge-commit,脚本依然未触发:
"hooks": { "pre-merge-commit": "npm run bump-version" }
解决方案
1. 明确Git钩子触发逻辑
pre-merge-commit仅在合并需要创建新提交时触发,而你这次合并是Fast-forward模式(无新提交生成),所以钩子不会执行。- 要在合并完成后无论是否Fast-forward都触发脚本,应该使用
post-merge钩子。
2. 正确配置husky的post-merge钩子
步骤1:创建post-merge钩子文件
执行以下命令生成husky的post-merge钩子:
npx husky add .husky/post-merge "npm run bump-version"
生成的.husky/post-merge文件内容如下:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npm run bump-version
步骤2:添加分支判断(可选但推荐)
如果只想在合并到master分支时触发脚本,修改post-merge钩子加入分支判断:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" # 获取当前分支名 current_branch=$(git rev-parse --abbrev-ref HEAD) # 仅当当前分支是master时执行版本升级 if [ "$current_branch" = "master" ]; then npm run bump-version # 自动提交版本变更 git add package.json package-lock.json git commit -m "Bump version to v$(node -p "require('./package.json').version")" fi
步骤3:补全脚本依赖
版本升级脚本依赖semver,但当前package.json未包含该包,执行安装:
npm install semver --save-dev
步骤4:验证配置
执行合并操作测试:
git checkout master git merge dev
此时会自动触发版本升级脚本,选择版本类型后,若添加了自动提交逻辑,会自动提交版本变更。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

