1

我正在尝试设置一个 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

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

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

4

1 回答 1

1

当你定义一个 Git 别名时!,为了让它执行一个shell 命令(而不是传递参数的默认行为git),Git 使用:

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

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

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

# 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 知道这slsSelect-Stringcmdlet 的别名(即使使用后者的实际名称也不允许从PowerShell 外部调用它,因为它是通过特定于 PowerShell 的DLL实现的)。

相比之下,git ls-files -v它本身也可以在sh/bash中工作,因为它是对git外部程序任何shell 都可以调用的平台原生可执行文件)的调用。

于 2019-09-17T16:25:43.367 回答