如何在我想要提交的文件上运行更漂亮?

Pat*_*und 2 javascript git code-formatting pre-commit-hook prettier

使用Husky,我已经设置了package.json一个precommit钩子,以便在每次提交之前使用Prettier格式化我的JavaScript代码:

{
  "name": "prettier-demo",
  "scripts": {
    "precommit": "prettier --write **/*.js && git add ."
  },
  "devDependencies": {
    "husky": "^0.14.3",
    "prettier": "^1.8.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好,但有两个缺点:

  1. 如果我有一个包含数千个JavaScript文件的大型项目,我必须等待Prettier处理所有这些文件,即使只有少数文件已经更改; 这可能需要很长时间,并且在完成每次提交时都会很快就会紧张

  2. 有时我想只提交几个文件进行提交,将其他更改留在提交之外; 因为我git add .在运行Prettier后做了一切,我的所有更改总是会在提交中结束

如何在每次提交之前运行Prettier 只对已经上传的文件,忽略未分级或未更改的文件?

str*_*str 9

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

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

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

使用以下命令安装lint-stagedhusky,这是预提交挂钩所必需的:

npm install --save-dev lint-staged husky
Run Code Online (Sandbox Code Playgroud)

更改您的package.json如下:

{
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.js": [
      "prettier --write",
      "git add"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

我很快就使用了这个包

在我的中添加了一个脚本package.json

"pretty-quick": "pretty-quick" 
Run Code Online (Sandbox Code Playgroud)

在下面scripts {}

然后在我的pre-commit钩子下.husky/pre-commit

我添加了

`npm run pretty-quick`
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是,`pretty-quick` 已经好几年没有收到任何更新,并且不能与 prettier >= 3.xx 一起使用 (3认同)

Max*_*den 6

如果您不想添加 devDependency,lint-staged您也可以使用 Bash 脚本执行相同的操作:

#!/usr/bin/env bash
# chmod +x this and save in your PATH. Assumes `prettier` is in your `devDependencies` already
BASE=$(git merge-base master HEAD) # change master to whatever your trunk branch is
FILES=$(git diff --name-only $BASE HEAD | xargs)

npx prettier --list-different $FILES

# Want eslint too?
# npx eslint --ignore-path=.prettierignore $FILES
Run Code Online (Sandbox Code Playgroud)


kig*_*iri 6

我发现只是运行:

prettier --write $(git diff --name-only --diff-filter d | grep '\.js$' | xargs)
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上返回了一些路径中包含 .js 的结果。这对我来说效果更好: git diff --name-only | grep '\.ts$' (3认同)
  • 如果您正在开发 TypeScript 项目,这将匹配 .js、.ts、.jsx 和 .tsx:`prettier --write $(git diff --name-only --diff-filter d | grep -e ' \.[tj]sx\?$' | xargs)` (3认同)
  • 我还刚刚了解到,当文件被删除时,这将会失败。Prettier 将尝试格式化已删除的文件。要使其工作,请使用 `prettier --write $(git diff --name-only --diff-filter d | grep '\.ts$' | xargs)` (2认同)