首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能在Husky "commit-msg“钩子中添加新文件吗?

您能在Husky "commit-msg“钩子中添加新文件吗?
EN

Stack Overflow用户
提问于 2022-10-11 18:19:13
回答 1查看 135关注 0票数 1

我正在尝试建立一个自动版本控制系统,如果我使用消息git commit PATCH: {message},应用程序的补丁版本将自动更新(同样,对于MINORMAJOR前缀也是如此)。我使用哈士奇作为我的pre-commitpre-push钩子,所以我尝试使用如下所示的.husky/commit-msg钩子:

代码语言:javascript
复制
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run auto-version $1 && git add --all

这按照我的auto-version.js脚本的要求工作,自动读取提交消息并相应地更新./version.json。唯一的问题是提交是用旧的version.json文件创建的,我不知道为什么。我可以判断git add是功能性的,因为在提交之后,version.json文件被更新后放在Staged Changes部分中。我的.husky/pre-commit钩子看起来像这样,在提交之前对更新的文件进行分级:

代码语言:javascript
复制
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run lint && npm run format && git add --all

我认为这可能与触发commit-msg钩子和git将接受新阶段文件之间的时间有关,但是Husky并没有提供关于commit-msg钩子如何工作的很好的文档。我还尝试使用pre-commit钩子来设置它,但是在这个阶段,新提交消息没有保存到.git/COMMIT_EDITMSG (只有旧的提交消息存在)。

对于一些额外的上下文,我们目前只是在pre-commit挂钩上触发pre-commit,然后在需要时手动更改次要版本和主要版本。我想要做一个更健壮和自动化的系统,这导致了这个阻滞剂。

auto-version.js

代码语言:javascript
复制
const { readFileSync, writeFileSync } = require('fs');

const versionJsonPath = './version.json';
const commitMessagePath = '.git/COMMIT_EDITMSG';

const prefixOptions = ['PATCH', 'MINOR', 'MAJOR'];
const postfixMinLength = 12;

(() => {
    // read commit message
    const rawMessage = readFileSync(commitMessagePath, 'utf-8');
    const message = rawMessage.split(/\r?\n/)[0];
    console.log(`Reading commit message "${message}"...`);

    // check for merge commit
    if (message.startsWith('Merge branch')) {
        process.exit();
    }

    // check for core composition
    const messageParts = message.split(':');
    if (messageParts.length != 2) {
        throwError(`Commit message should take the form "{${prefixOptions.join('|')}}: {message}".`);
    }

    // check for valid prefix
    const messagePrefix = messageParts[0];
    if (!prefixOptions.includes(messagePrefix)) {
        throwError(`Commit message prefix must be one of the following version types: [${prefixOptions.join(', ')}].`);
    }

    // check for valid postfix
    const messagePostfix = messageParts[1];
    if (messagePostfix.trim().length < postfixMinLength) {
        throwError(`Commit message postfix must be at least ${postfixMinLength} characters.`);
    }

    // update app version
    const versionJson = JSON.parse(readFileSync(versionJsonPath, 'utf-8'));
    const oldVersion = versionJson.appVersion;
    const versionParts = oldVersion.split('.').map(v => parseInt(v, 10));

    if (messagePrefix == 'MAJOR') {
        versionParts[0]++;
        versionParts[1] = 0;
        versionParts[2] = 0;
    } else if (messagePrefix == 'MINOR') {
        versionParts[1]++;
        versionParts[2] = 0;
    } else {
        versionParts[2]++;
    }

    const newVersion = versionParts.join('.');
    versionJson.appVersion = newVersion;

    console.log(`Updating app version from ${oldVersion} to ${newVersion}...`);
    writeFileSync(versionJsonPath, JSON.stringify(versionJson));

    process.exit();
})();

function throwError(message) {
    console.error(message);
    process.exit(1);
}

version.json

代码语言:javascript
复制
{
    "appVersion": "0.12.15"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-11 21:27:39

查看另一篇文章(Git钩子提交-msg git添加文件),在commit-msg钩子阶段/之后,似乎不可能执行git add。在其中一个答案的基础上,我通过使用post-commit钩子来修改提交以包含更新的带有git commit --amend -C HEAD -n version.jsonversion.json文件来解决问题。

..husky/后期提交

代码语言:javascript
复制
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run auto-version-post-commit

post-commit脚本确保有一个要添加的version.json文件以防止无限的git钩子递归:

代码语言:javascript
复制
var exec = require('child_process').exec;

const versionJsonPath = 'version.json';

(() => {
    exec('git diff --name-only', (error, stdout, stderr) => {
        const modifiedFiles = stdout.trim().split(/\r?\n/);

        // check if version.json has been modified by commit-msg hook
        if (modifiedFiles.includes(versionJsonPath)) {
            // amend the last commit to include the updated version.json
            exec(`git commit --amend -C HEAD -n ${versionJsonPath}`);
        }
    });
})();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74032487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档