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

时间:2019-09-17 14:55:07

标签: git powershell git-alias

我正在尝试设置git别名,以列出使用以下命令标记为“假定不变”的所有文件:

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

我的.gitconfig文件中有

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

我尝试了不同的变化...  用“!”感叹号和没有感叹号
用双引号或单引号引起来,而没有。

如果我移除了末端部分,则可以按预期工作,例如

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

所以我认为命令后半部分的语法有问题吗?

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

1 个答案:

答案 0 :(得分:1)

当您使用!定义Git别名以使其执行 shell命令时(而不是将 arguments 传递给{{ 1}}),Git使用:

  • 在类似Unix的平台上:默认外壳git
  • 在Windows上:Git附带的Bash版本

因此,为了定义执行 PowerShell 命令的Git别名,必须显式调用PowerShell's CLI 并通过{ {1}}参数:

这是一个完整的例子;请注意,它假定使用PowerShell Core ;对于 Windows PowerShell ,将/bin/sh替换为-c

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被作为外部程序查找而失败(假定它既不是{{1 }} / bash内置,也没有用户定义的函数,也没有 sls / sh 别名)(不存在(“ {{1 }}“)。

只有PowerShell知道bashsh cmdlet的别名(即使使用后者的实际名称也不允许从PowerShell之外的调用它。 ,因为它是通过特定于PowerShell的 DLL 来实现的。)

相比之下,bash本身也可以在command not found / sls中工作,因为它是对外部程序Select-String的调用任何 shell可以调用的平台本地可执行文件)。