如何修复:找不到命令 - Git 别名

How to fix : Command not found - Git Alias

我正在尝试设置一个 git 别名以列出使用此命令标记为 'assume-unchanged' 的所有文件:

git ls-files -v | sls -pattern ^h -casesensitive

当我直接在 powershell 中使用此命令时,它按预期工作但作为别名我收到错误:

PS C:\git\sim> git unchanged
git ls-files -v | sls -pattern ^h -casesensitive: sls: command not found

在我的 .git 配置文件中

# ALIASES   
[alias]
  unchanged = !git ls-files -v | sls -pattern ^h -casesensitive

我尝试了不同的变化... 和 '!'感叹号和没有,
包裹在 double/single 引号中并且没有。

如果我删除结束部分,它会按预期工作,例如

[alias]
  unchanged = !git ls-files -v

所以我假设命令后半部分的语法有问题?

任何帮助将不胜感激...

当您使用 ! 定义 Git 别名以使其执行 shell 命令时 (而不是默认行为将 参数 传递给 git),Git 使用:

  • 在类 Unix 平台上:默认 shell/bin/sh
  • on Windows:与 Git
  • 捆绑的 Bash 版本

因此,为了定义执行 PowerShell 命令的 Git 别名,您必须显式调用 PowerShell's CLI 并通过 -c 参数将命令传递给它:

这是一个完整的例子;请注意,它假定 PowerShell Core;对于 Windows PowerShell,将 pwsh 替换为 powershell:

# Run from PowerShell

# Define the alias.
# Note the unexpected need to escape " as \" - see below.
git config --global alias.unchanged '! pwsh -noprofile -c \"git ls-files -v | sls -pattern ^h -casesensitive\"'

# Invoke it.
git unchanged

顺便说一句:请注意需要 \-转义嵌入的 " 字符的尴尬,即使它们在单引号字符串 '...' 中 - 这很不幸this GitHub issue.

中讨论了要求 - 似乎不会为了向后兼容性而删除 -

至于你试过的

将您的别名定义为:

[alias] unchanged = !git ls-files -v | sls -pattern ^h -casesensitive

表示sh / bash正在执行命令,如上所述。

虽然该命令在语法上有效,但它失败了,因为 sls 被查找为 外部程序(给定它既不是 sh / bash 内置函数,也不是用户定义函数,也不是 sh / bash 别名) , 不存在 ("command not found").

只有 PowerShell 知道 slsSelect-String cmdlet 的别名(即使使用后者的实际名称也不允许从 PowerShell 外部调用它,假设它是通过特定于 PowerShell 的 DLL) 实现的。

相比之下,git ls-files -v 本身也适用于 sh / bash,因为它是对 git 的调用, 外部程序(一个平台本地可执行文件任何 shell可以调用)。