2

提交时如何获得 git commit 消息?我用哈士奇。

我已经尝试在准备提交消息时获取提交消息。

打包

{
  ...
  "version": "0.1.0",
  "private": true,
  ...
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "prepare-commit-msg": "cd ../tweet-git && node index.js"
    }
  },
  ...
}

推文-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);
});

标准输出将未定义。请帮忙,谢谢

4

1 回答 1

2

您走在正确的轨道上,但是这里发生的一些事情似乎不对劲。

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

  2. 为了阅读当前提交消息,您不能使用git rev-listorgit log或任何回读先前提交的内容。看一下 Husky,它似乎也没有将消息作为参数传递,大多数人建议通过 Husky 的集合获取存储消息的文件路径,然后environment variable使用 FS 读取它(链接1、23)。

基于上述观察,这里有一个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.

于 2019-11-03T07:55:18.643 回答