我正在尝试设置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
所以我认为命令后半部分的语法有问题吗?
任何帮助将不胜感激...
答案 0 :(得分:1)
当您使用!
定义Git别名以使其执行 shell命令时(而不是将 arguments 传递给{{ 1}}),Git使用:
git
因此,为了定义执行 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知道bash
是sh
cmdlet的别名(即使使用后者的实际名称也不允许从PowerShell之外的调用它。 ,因为它是通过特定于PowerShell的 DLL 来实现的。)
相比之下,bash
本身也可以在command not found
/ sls
中工作,因为它是对外部程序Select-String
的调用(任何 shell可以调用的平台本地可执行文件)。