Как я могу получить сообщение git commit, когда я отправляю сообщение? - PullRequest
1 голос
/ 03 ноября 2019

Как я могу получить сообщение git 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);
});

стандартный вывод будет неопределенным. Пожалуйста, помогите, спасибо

1 Ответ

1 голос
/ 03 ноября 2019

Вы находитесь на правильном пути, но здесь происходит несколько вещей, которые кажутся неправильными.

  1. Ваша команда (git rev-list --format=%s --max-count=1 HEAD) получит сообщение от последний сделанный коммит, а не тот, который выполняется в данный моментЭто будет undefined, если вы делаете свой первый коммит, и, вероятно, это не то, что вы хотите использовать, если ваша конечная цель - использовать текущее сообщение о коммите.

  2. В порядкечтобы прочитать текущее сообщение о коммите, вы не можете использовать git rev-list или git log, или что-либо, что читает предыдущие коммиты. Взглянув на Husky, похоже, что он также не передает сообщение в качестве аргумента, и большинство людей рекомендует захватить путь к файлу сохраненного сообщения через набор environment variable Husky, а затем использовать 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.

...