当你定义一个 Git 别名时!
,为了让它执行一个shell 命令(而不是传递参数的默认行为git
),Git 使用:
- 在类 Unix 平台上:默认 shell,
/bin/sh
- 在 Windows 上:与 Git 捆绑在一起的 Bash 版本
因此,为了定义执行PowerShell命令的 Git 别名,您必须显式调用PowerShell 的 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
\
顺便说一句:请注意 -转义嵌入字符的尴尬需要"
。,即使它们在单引号字符串中'...'
- 这个不幸的要求 - 为了向后兼容性,似乎不会被删除 - 在此讨论GitHub问题。
至于你尝试了什么:
将您的别名定义为:
[alias]
unchanged = !git ls-files -v | sls -pattern ^h -casesensitive
表示sh
/bash
正在执行命令,如上所述。
虽然该命令在语法上是有效的,但它失败了,因为它sls
被视为一个不存在的外部程序(假设它既不是sh
/bash
内置程序,也不是用户定义的函数,也不是sh
/bash
别名),它不存在(“ command not found
”) .
只有 PowerShell 知道这sls
是Select-String
cmdlet 的别名(即使使用后者的实际名称也不允许从PowerShell 外部调用它,因为它是通过特定于 PowerShell 的DLL实现的)。
相比之下,git ls-files -v
它本身也可以在sh
/bash
中工作,因为它是对git
外部程序(任何shell 都可以调用的平台原生可执行文件)的调用。