Git PowerShell 上的环境变量 Windows

Git environment variables on PowerShell on Windows

以下函数取自 ohmyzsh,出于教育目的,我正在重写它以与 PowerShell 7.2.2 一起使用。

function __git_prompt_git() {
  GIT_OPTIONAL_LOCKS=0 command git "$@"
}

显然,PS 不支持像 ($foo='bar' func) 这样的内联变量,并且 ($foo='bar'; func); 处抛出错误。另外,我不知道 Git for Windows 是否读取自 $GIT_OPTIONAL_LOCKS$env:GIT_OPTIONAL_LOCKS.

环境变量不同于您在 Powershell 中使用的普通变量。环境是 env: implicit "PS Drive" 允许您访问的环境,它位于其他几个 drive-like 命名空间旁边,其中一些是实际的驱动器,如 C: 等等。

PS C:\> get-psdrive

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Alias                                  Alias
C                 127.73        337.38 FileSystem    C:\
Cert                                   Certificate   \
D                 281.46       2700.96 FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

正如您所怀疑的那样,您确实可以 dir (Get-ChildItem) env: "drive":

PS C:\> dir env:

Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\myname\AppData\Roaming
...

所以是的,$GIT_OPTIONAL_LOCKS 和 $env:GIT_OPTIONAL_LOCKS 确实是完全不同的。第一个只是 运行 powershell 范围内的一个变量,第二个是同名(巧合)的环境变量。

由于环境变量是外部变量,因此您需要保存和恢复,例如:

$t = $env:GIT_OPTIONAL_LOCKS
$env:GIT_OPTIONAL_LOCKS = 0
git "$@"
$env:GIT_OPTIONAL_LOCKS = $t

如果环境变量尚不存在,这样做是正确的; $t 将设置为 $null 并将环境变量设置为 $null 会将其从环境中删除。