我正在尝试建立一个自动版本控制系统,如果我使用消息git commit PATCH: {message},应用程序的补丁版本将自动更新(同样,对于MINOR和MAJOR前缀也是如此)。我使用哈士奇作为我的pre-commit和pre-push钩子,所以我尝试使用如下所示的.husky/commit-msg钩子:
#!/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钩子看起来像这样,在提交之前对更新的文件进行分级:
#!/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
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
{
"appVersion": "0.12.15"
}发布于 2022-10-11 21:27:39
查看另一篇文章(Git钩子提交-msg git添加文件),在commit-msg钩子阶段/之后,似乎不可能执行git add。在其中一个答案的基础上,我通过使用post-commit钩子来修改提交以包含更新的带有git commit --amend -C HEAD -n version.json的version.json文件来解决问题。
..husky/后期提交
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run auto-version-post-commitpost-commit脚本确保有一个要添加的version.json文件以防止无限的git钩子递归:
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}`);
}
});
})();https://stackoverflow.com/questions/74032487
复制相似问题