如何修复:找不到命令 - 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 知道 sls
是 Select-String
cmdlet 的别名(即使使用后者的实际名称也不允许从 PowerShell 外部调用它,假设它是通过特定于 PowerShell 的 DLL) 实现的。
相比之下,git ls-files -v
本身也适用于 sh
/ bash
,因为它是对 git
的调用, 外部程序(一个平台本地可执行文件,任何 shell可以调用)。
我正在尝试设置一个 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 知道 sls
是 Select-String
cmdlet 的别名(即使使用后者的实际名称也不允许从 PowerShell 外部调用它,假设它是通过特定于 PowerShell 的 DLL) 实现的。
相比之下,git ls-files -v
本身也适用于 sh
/ bash
,因为它是对 git
的调用, 外部程序(一个平台本地可执行文件,任何 shell可以调用)。