提交时如何获取git commit消息?

时间:2019-11-03 00:05:01

标签: node.js git npm husky

提交时如何获取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将是未定义的。请帮忙,谢谢

1 个答案:

答案 0 :(得分:1)

您处在正确的轨道上,但是这里似乎发生了一些事情。

  1. 您的命令(git rev-list --format=%s --max-count=1 HEAD)将从上一个提交而不是当前正在进行的提交中获取消息。如果您是第一次提交,则为undefined,如果最终目标是使用当前提交消息,则可能不是您要使用的内容。

  2. 为了读取 current 提交消息,您不能使用git rev-listgit log或任何能回读先前提交的内容。看一下Husky,看起来它也没有将消息作为参数传递,而且大多数人建议通过Husky的environment variable获取存储的消息的文件路径,然后使用FS进行读取(链接:123)。

基于以上观察,这是一个更新的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