git 使用pre-commit工具,有没有办法将文件名一个接一个地传递给'entry'程序?

wn9m85ua  于 2023-10-14  发布在  Git
关注(0)|答案(1)|浏览(130)

使用pre-commit,我试图调用PSScriptAnalyzer工具作为PowerShell脚本的静态检查器。由于PowerShell没有pre-commit language,而且我不想为这个简单的任务向存储库添加额外的脚本,所以我必须求助于system,并将pwsh作为预安装的系统命令调用。
我也不想以PSScriptAnalyzer -Recurse -Path .的身份运行检查器,因为我不想检查git忽略的文件或未修改的文件,也不想检查变更的一部分。
因此,我在.pre-commit-config.yaml文件中提出了以下片段:

- repo: local
  hooks:
    - id: PSScriptAnalyzer
      name: Check Powershell scripts with PSScriptAnalyzer
      language: system
      entry: pwsh -NoProfile -NonInteractive -Command Invoke-ScriptAnalyzer -EnableExit -Path 
      files: ^.*\.ps1$
      pass_filenames: true

问题是这个命令只能处理传递给它的一个参数,但是pre-commit在命令的末尾传递任何匹配的文件作为参数,导致错误。
pre-commit似乎没有一个选项来改变这种行为,并单独传递文件。主机是Linux,内部安装了最新版本的pre-commit和mysql。
我如何才能做到这一点?

u1ehiz5o

u1ehiz5o1#

pre-commit故意不支持一次一个文件,因为它非常低效(每个文件启动和停止一个进程(或多个进程)非常慢)。
理想情况下,另一个工具(PSScriptAnalyzer)将被调整为支持传递多个参数(因为这将具有预提交之外的好处,例如与xargs一起使用)
也就是说,您可以通过一点xargs--将参数序列转换为单独的调用--在您尝试使用的任何工具中解决这个缺陷
下面是问题跟踪器中最旧的副本,并概述了解决方案(您可能可以将bash解决方案调整为powershell,或者如果您不关心空间,则使用xargs -n1):

entry: bash -c 'for x in "$@"; do ... "$x"; done' --

免责声明:我写了pre-commit

相关问题