You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并至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

已尝试的操作

  1. 执行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(-)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:15:13