有没有办法只在新文件上运行 lint-staged (之前 git 未跟踪的文件)

Posted

技术标签:

【中文标题】有没有办法只在新文件上运行 lint-staged (之前 git 未跟踪的文件)【英文标题】:Is there a way to run lint-staged only on new files (the ones that were untracked by git before) 【发布时间】:2019-07-22 03:20:03 【问题描述】:

在我用 Typescript 编写的项目中,我想开始为所有函数的返回类型和参数类型强制执行类型注释。为此,我创建了一个单独的 tslint 配置,该配置扩展了我的主配置,并在此基础上添加了此规则。我正在通过 husky 运行 tslint,并使用此扩展配置进行 lint-staged,以在提交更改之前检查所有暂存文件。问题是:如果我对其中一个旧文件(其中一些非常大)进行更改,lint staged 也会检查这个文件,除非我对所有文件中的所有函数进行类型注释,否则不会让我提交。但这是很多工作,我只想对新文件强制执行此操作。有没有办法将暂存文件过滤到仅在此提交中添加的文件?

【问题讨论】:

【参考方案1】:

如果您使用目录结构将“新”代码与“旧”代码分开,则可以这样做。在那之后,您的 lint-staged 配置中只有 2 种不同的 glob 模式。

这是我能想到的最简单的方法,而且它与 ESLint 等其他代码质量工具配合得很好,因为您可以将 .eslintrc 放入子目录中。

【讨论】:

我不希望改变我目前的项目结构,但还是谢谢【参考方案2】:

lint-staged 使用另一个名为 staged-git-files(sgf) 的库在 git 提交之前检索文件列表staged

以下是 sgf 使用的一些状态码。

已添加 (A) 已复制 (C) 已删除 (D) 修改 (M) 重命名 (R)

lint-staged 将状态码 ACM 传递给 sgf 包。

 sgf.cwd = gitDir
  *return pify(sgf)('ACM').then(files => *
    /* files is an Object filename: String, status: String  */
    const filenames = files.map(file => file.filename)

如果您希望lint-staged 仅检索添加的文件,则可以分叉存储库并将 AC 传递给 sgf。如果我们有一种配置方法,那将是理想的。我在回购中提出了issue。我希望他们解决这个问题

【讨论】:

以上是关于有没有办法只在新文件上运行 lint-staged (之前 git 未跟踪的文件)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?

lint-staged 正在为所有更改的文件运行 ng -lint,而不仅仅是暂存文件

在 Intellij idea 中运行“ng lint --fix”后,“lint-staged”包未提交更新的文件

Husky/lint-staged 是不是可以排除/忽略文件?

Husky v5 不创建 Git 钩子

为啥我的 React 应用程序只在新选项卡中看起来不错?