我正在开始一个新的存储库,认为我应该使用最新的 Huksy v6,它是使用其设置指南从 LintStages 安装的:
npx mrm lint-staged
// package.json updated with:
"husky": ">=6",
"lint-staged": ">=10",
Run Code Online (Sandbox Code Playgroud)
这将添加必要的包并添加 husky 文件,包括预提交文件:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
Run Code Online (Sandbox Code Playgroud)
当我在终端中运行我的提交时,它工作正常。但是,如果我尝试在 GitHub Desktop 或 VSCode 中运行我的提交(我知道一些队友会这样做),则会导致两者出现错误:
npx:未找到命令。husky - 预提交挂钩退出,代码为 127(错误)
我已经安装了 npx:
npx -v
// 6.14.10
Run Code Online (Sandbox Code Playgroud)
如果我尝试在 globall 中安装,如其他 StackOverflow 建议中所述,它会返回有关现有位置的警告(带 & 不带 out sudo
):
呃!EEXIST:文件已存在,符号链接 '../lib/node_modules/npx/index.js' -> '/Users/plucks/.nvm/versions/node/v14.15.4/bin/npx' npm 错误!文件存在:/Users/plucks/.nvm/versions/node/v14.15.4/bin/npx npm 错误!删除现有文件并重试,或运行 npm npm ERR! 使用 --force 鲁莽地覆盖文件。
我可以做些什么来让 VSCode 和 GitHub Desktop 等程序可以运行吗?
我有一个没有 eslint/prettier 的遗留代码库。我想介绍预提交挂钩的格式化。Lint 暂存将使您仅对更改的文件运行更漂亮。是否可以仅针对更改的行运行更漂亮的程序?与 IntelliJ 的内置格式一样,仅允许 VCS 更改文本格式。
将我的代码推送到远程分支并创建 PR 后。我想对我的代码进行更多更改,然后再次提交到远程分支
首先,我开始执行以下步骤:
git add .
git commit -m "Remove semicolons, change to multi line returns"`
Run Code Online (Sandbox Code Playgroud)
我检查了状态并取消暂存所有添加的文件
git status
git restore --stage .
Run Code Online (Sandbox Code Playgroud)
-> 然后我再次添加并提交,错误仍然存在。
之后,我撤消提交并拉动分支以重新开始
git reset HEAD^
git pull
Run Code Online (Sandbox Code Playgroud)
当我完成对代码的更改后,我跑去git diff
看我所做的更改。最后,我运行了git add .
& git commit -m "Recommit message"
,但不知何故错误又回来了
谁能帮助我了解到底发生了什么以及我该如何解决它?
如果我们无法修复它,有什么办法可以使代码恢复正常吗?
谢谢你!
更漂亮的是没有预先运行.这在其他项目中使用相同的配置,所以我很困惑为什么这次不工作.
这是我的package.json文件的相关部分:
"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"*.{js,json,css,scss,html,md}": [
"prettier --write",
"git add"
]
},
Run Code Online (Sandbox Code Playgroud)
编辑.以下是相关的devDependencies:
"devDependencies": {
"husky": "^0.14.3",
"lint-staged": "^7.0.4",
"prettier": "1.12.0"
},
Run Code Online (Sandbox Code Playgroud) 我尝试使用赫斯基pre-commit
和lint-staged
.
安装了这些:
"husky": "^5.1.3",
"lint-staged": "^10.5.4",
Run Code Online (Sandbox Code Playgroud)
在 package.json 我有:
"scripts": {
"build": "gatsby build",
"develop": "gatsby develop",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
"start": "npm run develop",
"serve": "gatsby serve",
"clean": "gatsby clean",
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
"lint": "eslint --ext .js,.jsx,.ts,.tsx src --color",
"isready": "npm run format && npm run lint && npm run build"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"pre-push": "npm test",
}
},
"lint-staged": {
"./src/*.{js,jsx,ts,tsx}": [
"npm run …
Run Code Online (Sandbox Code Playgroud) 采用以下Typescript箭头功能:
/**
* Returns a probably unique component name.
*
* @param baseName a suggested name to make unique.
* @returns a probably unique name.
*/
export const getUniqueComponentName = (
baseName
): string => {
return baseName + Math.round(Math.random() * 10000000)
}
Run Code Online (Sandbox Code Playgroud)
当Typescript配置tsconfig.json
为这样时:
"noImplicitAny": true,
Run Code Online (Sandbox Code Playgroud)
这正确导致编译错误:
[ts]参数'baseName'隐式具有'any'类型.
Visual Studio Code也非常智能,可以在开发过程中告知您这个问题.
我的目标是创建一个precommit git hook,以防止此类错误在版本控制中结束.我试着这样做tslint
,husky
并lint-staged
使用这个npm script
:
"lint": "tslint --project tsconfig.json --config tslint.json"
Run Code Online (Sandbox Code Playgroud)
但是,这不会导致tslint显示编译错误.它被默默地忽略了.
然后我尝试在tslint.json中添加一条规则:
"typedef": [
true,
"arrow-parameter"
]
Run Code Online (Sandbox Code Playgroud)
虽然这确实让tslint抱怨,但它也开始抱怨匿名箭头函数,tsc …
我发现许多博客(包括 lint-staged 文档)介绍了一种使用 husky+ lint-staged 的方法,作为 package.json 中定义的以下代码:
{
"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"src/**/*.js": ["prettier --write","eslint --fix", "git add"]
}
}
Run Code Online (Sandbox Code Playgroud)
由于存在“prettier”和“eslint --fix”都无法修复的错误,我们如何防止这种用法造成的错误提交?
我正在尝试使用预提交钩子在提交之前检测 eslint 错误。我正在使用 husky 和 lint-staged。但它对 src 中的所有文件运行 lint 命令,而不仅仅是对暂存文件运行。这是我的 package.json 文件。
"scripts": {
"test:ci": "cross-env CI=true react-scripts test --bail --passWithNoTests",
"lint": "eslint src/**/*.{js,jsx}",
"lint:fix": "eslint . --fix",
"precommit": "npm run lint && npm run test:ci"
}
Run Code Online (Sandbox Code Playgroud)
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
Run Code Online (Sandbox Code Playgroud)
"lint-staged": {
"*.js": [
"npm run precommit"
],
"*.jsx": [
"npm run precommit"
]
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使它仅适用于暂存文件而不适用于目录中存在的其他文件?
pre-commit-hook eslint husky eslint-config-airbnb lint-staged
TLDR:git rev-parse -q --verify MERGE_HEAD
不处于合并状态时会出错。当我们处于合并状态时,如何获得会出错的类似命令?
问题:当我将 master 合并到我的分支并且它存在冲突时,我必须手动更正它们,然后提交。但在某些情况下,我有太多来自 master 的更改,所以我宁愿跳过预提交挂钩。
部分解决方案:我可以运行git commit --no-verify
并合并内容,但那是因为我知道该标志。其他开发人员可能不知道这一点,因此(1)他们花费了比需要更多的时间来等待预提交挂钩运行,并且(2)因为这可能需要很长时间,他们往往不太可能重新合并主节点(假设) 。
几乎确定的解决方案:我找到了一种通过使用 来检测我是否处于合并状态的方法git rev-parse -q --verify MERGE_HEAD
。当处于合并状态时,它返回一个哈希值,当不处于合并状态时,它会出错。但我需要的恰恰相反。当我处于合并状态时,我需要它出错,因此我可以将它作为预提交挂钩添加到我的所有挂钩中。这会使他们在第一行失败,然后不执行以下命令。
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.js": [
"git rev-parse -q --verify MERGE_HEAD",
"eslint --max-warnings 0 --fix"
],
"*.scss": [
"git rev-parse -q --verify MERGE_HEAD",
"stylelint 'app/**/*.scss'"
],
"*.{js,json,yml,scss,md}": [
"git rev-parse -q --verify MERGE_HEAD",
"prettier --write"
],
"*": [
"bundle exec rubocop --auto-correct --force-exclusion"
]
}, …
Run Code Online (Sandbox Code Playgroud) 今天我运行 eslint?two 脚本
"lint-staged": "lint-staged",
"eslint": "eslint --ext .tsx,.ts --fix ./src -c .eslintrc.js",
Run Code Online (Sandbox Code Playgroud)
当我运行时npm run eslint
// 没关系 当我运行时npm run lint-staged
// 它是错误的
lint-staged 的结果;
> lint-staged
? Running tasks for src/**/*.tsx
? eslint --fix [FAILED]
? git add
? eslint --fix :
Oops! Something went wrong! :(
ESLint: 7.10.0
Error: Error while loading rule '@typescript-eslint/dot-notation': You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for …
Run Code Online (Sandbox Code Playgroud) lint-staged ×10
husky ×8
eslint ×4
git ×3
javascript ×3
prettier ×2
git-husky ×1
pre-commit ×1
tslint ×1
typescript ×1