使用预提交工具,有没有办法将文件名一个接一个地传递到“入口”程序?

Using pre-commit tool, is there a way to pass filenames one by one to the `entry` program?

提问人:zaadeh 提问时间:10/6/2023 最后编辑:zaadeh 更新时间:10/6/2023 访问量:89

问:

使用预提交,我尝试调用 PSScriptAnalyzer 工具作为 PowerShell 脚本的静态检查器。 由于 PowerShell 没有预提交语言,并且我不想为这个简单任务向存储库添加其他脚本,因此我必须求助于语言并作为预安装的系统命令进行调用。systempwsh

我也不想运行检查器,因为我不希望 git 忽略的文件或未修改且不属于变更集的文件也被检查。PSScriptAnalyzer -Recurse -Path .

所以我在我的文件中想出了以下片段:.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 和 pwsh。

我怎样才能做到这一点?

git powershell pre-commit-hook 预提交 pre-commit.com

评论


答:

1赞 anthony sottile 10/6/2023 #1

预提交故意不支持一次一个文件,因为它效率非常低(每个文件启动和停止一个(或更多)进程非常慢)。

理想情况下,将调整其他工具 (PSScriptAnalyzer) 以支持传递多个参数(因为这将在预提交之外具有好处,例如使用xargs)

也就是说,你可以通过一点点将参数序列转换为单个调用来绕过你尝试用于预提交的任何工具中的这个缺陷xargs

这是问题跟踪器中最早的副本,并概述了解决方案(如果您不关心空格,则可以调整解决方案或利用该解决方案):bashpowershellxargs -n1

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

免责声明:我写了预提交