Хук предварительной фиксации Husky завершается после фиксации

#node.js #husky

#node.js #husky

Вопрос:

Следующий скрипт был написан для сортировки файлов JSON по ключу в ху предварительной фиксации:

  /*
 * Will reorder all files in given path.
 */

const sortJson = require("sort-json");
const fs = require("fs");
const chalk = require("chalk");

const log = console.log;
const translationsPath = process.argv.slice(2).join(" ");

function readFiles(dirname) {
  try {
    return fs.readdirSync(dirname);
  } catch (e) {
    log(chalk.red(`Failed reading files from path; ${e}`));
  }
}

log(
  chalk.bgGreen(
    `Running json sort pre-commit hook on path: ${translationsPath}`
  )
);

const files = readFiles(translationsPath);
files.forEach((file) => {
  log(chalk.yellow(`Sorting ${file}...`));
  try {
    sortJson.overwrite(`${translationsPath}\${file}`);
    log(chalk.green(`Finished sorting ${file}`));
  } catch (e) {
    log(chalk.red(`Failed sorting file ${file}; ${e}`));
  }
});

log(
  chalk.bgGreen(
    `Finished sorting files`
  )
);
  

Я прикрепляю скрипт к моему ху предварительной фиксации package.json with husky :

   "scripts": {
    "sort-translations": "node ./scripts/husky/json-sort src/assets/translations",
    ...
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run sort-translations"
    }
  },
  

Результатом является то, что фиксация завершена, и только тогда скрипт завершает работу с созданными изменениями unstage.
Сам скрипт выполняется синхронно с Finished sorting files сообщением, напечатанным последним.

Мой вопрос в том, как я могу сделать это синхронным; сначала завершите выполнение node ./scripts/husky/json-sort src/assets/translations , затем git commit .

Спасибо!

Комментарии:

1. Поскольку это всего лишь хук предварительной фиксации, использование sync функций безопасно . Так что, если вы используете fs.readdirSync() , это должно сработать. Использование async версии, скорее всего, ничего не улучшит в этом сценарии.

2. Спасибо @adelriosantiago, я изменил его на readdirSync(), но я все равно выполняю фиксацию до изменения файлов. Я отредактирую свой пост с новым кодом

Ответ №1:

Благодаря комментарию @adelriosantiago я понял это.

  1. Прежде всего, я начал использовать readdirSync() вместо readdir() . Затем я смог проверить (посредством протоколирования), что скрипт действительно завершается только при редактировании файлов. К сожалению, этого было недостаточно — хук по-прежнему заканчивался незафиксированными файлами.
  2. В этот момент я понял — дело не в ху, а в промежуточной обработке git! Скрипт завершает это время, но измененные изменения остаются неизмененными, поэтому они не фиксируются. Итак, я добавил хук amp;amp; git add src/assets/translations в pre-commit .

Теперь все работает так, как хотелось.