提交时如何获取git commit消息?我用沙哑。
当它是prepare-commit-msg时,我已经尝试获取提交消息。
pacakgejson
{
...
"version": "0.1.0",
"private": true,
...
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"prepare-commit-msg": "cd ../tweet-git && node index.js"
}
},
...
}
tweet-git / index.js
require('child_process').exec('git rev-list --format=%s --max-count=1 HEAD', function(err, stdout) {
const stdoutArray = stdout.split('\n')
let commitMessage = `【tweet-git】\nプロジェクト: 「project」にcommitしました\n`
commitMessage += stdoutArray[1]
console.log('commitMessage', commitMessage);
});
stdout将是未定义的。请帮忙,谢谢
答案 0 :(得分:1)
您处在正确的轨道上,但是这里似乎发生了一些事情。
您的命令(git rev-list --format=%s --max-count=1 HEAD
)将从上一个提交而不是当前正在进行的提交中获取消息。如果您是第一次提交,则为undefined
,如果最终目标是使用当前提交消息,则可能不是您要使用的内容。
为了读取 current 提交消息,您不能使用git rev-list
或git log
或任何能回读先前提交的内容。看一下Husky,看起来它也没有将消息作为参数传递,而且大多数人建议通过Husky的environment variable
获取存储的消息的文件路径,然后使用FS进行读取(链接:1,2,3)。
基于以上观察,这是一个更新的tweet-git/index.js
,应使用当前的提交消息:
const fs = require('fs');
const path = require('path');
// Tweak this to match the root of your git repo,
// below code assumes that git root is one dir above `/tweet-git`
const gitRootDir = __dirname + '/../';
const messageFile = path.normalize(gitRootDir + '/' + process.env.HUSKY_GIT_PARAMS.split(' ')[0]);
let commitMessage = `【tweet-git】\nプロジェクト: 「project」にcommitしました\n`
commitMessage += fs.readFileSync(messageFile, {encoding: 'utf-8'});
console.log('commitMessage', commitMessage);
请注意有关需要调整
gitRootDir
的警告; Husky提供的路径是相对于git初始化文件夹的根目录,而不是绝对路径,因此您当前的设置需要进行一些调整。这就是为什么大多数人将package.json
放在项目根目录级别的原因,然后在脚本中不要使用cd scripts && node my-git-hook.js
,而只使用node scripts/my-git-hook.js
。