如何只在我想提交的文件上运行 Prettier?

新手上路,请多包涵

使用 Husky ,我设置了我的 package.json 带有预提交挂钩,以便在每次提交之前使用 Prettier 格式化我的 JavaScript 代码:

 {
  "name": "prettier-demo",
  "scripts": {
    "precommit": "prettier --write **/*.js && git add ."
  },
  "devDependencies": {
    "husky": "^0.14.3",
    "prettier": "^1.8.2"
  }
}

这工作正常,但有两个缺点:

  1. 如果我有一个包含数千个 JavaScript 文件的大型项目,我必须等待 Prettier 处理所有文件,即使只有少数文件发生了变化;这可能会花费很长时间,并且在每次提交完成后都会很快让我感到紧张

  2. 有时我只想暂存几个文件用于提交,而将其他更改排除在提交之外;因为我做了 git add . 在运行 Prettier 之后,我所有的更改将始终在提交中结束

如何在每次提交之前 仅对已暂存的文件 运行 Prettier,而忽略未暂存或未更改的文件?

原文由 Patrick Hund 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 315
2 个回答

您可以使用 lint-staged 来做到这一点:

在提交代码之前运行 Linting 更有意义。通过这样做,您可以确保没有错误进入存储库并强制执行代码样式。但是在整个项目上运行 lint 过程很慢,而且 linting 结果可能无关紧要。最终,您只想对将要提交的文件进行 lint。

该项目包含一个脚本,该脚本将以暂存文件列表作为参数运行任意 npm 和 shell 任务,并按指定的 glob 模式进行过滤。

使用以下命令安装预提交挂钩所需的 lint-stagedhusky

 npm install --save-dev lint-staged husky

改变你的 package.json 如下:

 {
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.js": [
      "prettier --write",
      "git add"
    ]
  }
}

原文由 str 发布,翻译遵循 CC BY-SA 4.0 许可协议

我发现刚刚运行:

 prettier --write $(git diff --name-only --diff-filter d | grep '\.js$' | xargs)

足以满足我的需要,只是创建了一个别名并使用了它。

原文由 kigiri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题