1

编写以下脚本是为了在预提交挂钩上按键对 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.jsonhuskyprecommit 钩子上:

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

结果是提交完成,然后脚本才完成创建的未暂存更改。Finished sorting files脚本本身与最后打印的消息同步运行。

我的问题是,我怎样才能使它同步;先跑完node ./scripts/husky/json-sort src/assets/translations,然后git commit

谢谢!

4

1 回答 1

4

感谢@adelriosantiago 的评论,我明白了。

  1. 首先,我开始使用readdirSync()而不是readdir(). 然后我能够验证(通过日志记录)脚本确实仅在文件被编辑时才结束。不幸的是,这还不够——钩子仍然以未提交的文件结束。
  2. 在这一点上我意识到 - 这不是关于钩子,而是关于 git staging!脚本结束它的时间,但修改后的更改仍然未暂存,因此它们没有提交。所以我添加 && git add src/assets/translationspre-commit钩子。

现在一切都按预期工作。

于 2020-08-17T10:46:59.730 回答