提交时如何获得 git 提交消息?

How can I get git commit message when I commited?

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

我已经尝试在 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. 您的命令 (git rev-list --format=%s --max-count=1 HEAD) 将从 上次 提交中获取消息,而不是当前正在进行的提交。如果您是第一次提交,这将是 undefined,如果您的最终目标是使用当前提交消息,则可能不是您想要使用的内容。

  2. 为了阅读 current 提交消息,您不能使用 git rev-listgit log,或任何读取返回先前的提交。看看 Husky,它似乎也没有将消息作为参数传递,大多数人建议通过 Husky 的 set 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);

Please note the warning about needing to tweak gitRootDir; the path that Husky provides is relative to the root of the git initialized folder, and not absolute, so your current setup would require some tweaking. This is part of why most people put package.json at the project root level, and then in scripts, don't use cd scripts && node my-git-hook.js, they just use node scripts/my-git-hook.js.