防止或解决 Git for Windows 更新程序更改 PATH 中的 git 二进制优先级

Prevent or work around Git for Windows updater changing git binary precedence in PATH

我的机器上有调用 git 的 PowerShell 脚本,即 Git 调用 Windows。我还安装了 Cygwin,它在添加到 PATH 的主 bin 文件夹中有一个 git 二进制文件。

当我从这些脚本调用 git 时,我希望它们对 Windows 二进制文件使用正常的 Git。 (cygwin 二进制文件不会工作,它认为当 运行 “git status --porcelain” 时未更改的文件被更改,我怀疑是由于其全局配置中的行结尾有一些不同。那是在点。)因此,我将我的 PATH 设置为 Git for Windows 二进制文件夹出现在 Cygwin bin 文件夹之前。这是完美的,正确的二进制文件被脚本调用,Cygwin 可以继续存在不受干扰。

问题是每次 Git Windows 自动更新时,它都会编辑 PATH 以删除其条目,然后重新添加其条目,有效地将其条目移动到末尾 -优先于 Cygwin 之后。我的脚本失败了几次,直到我记得我需要再次编辑 PATH。

有没有办法让 Git for Windows updater 单独保留 PATH,更好的方法让 PowerShell 脚本使用正确的 git 二进制文件(没有对路径进行硬编码,脚本必须在所有开发人员的机器上运行)或其他一些解决方法?

这更像是一种使用 PowerShell 配置文件的解决方法,但如果您添加:

$env:PATH = 'C:\Path\To\Git\For\Windows\bin;' + $env:PATH

到您的 $profile 位置之一,这将有效地保证 Windows 二进制文件的 Git 总是在 cygwin 可以。请注意,这不能解决在 PowerShell 外部启动的进程或以 -NoProfile.

启动的 PowerShell 会话的问题

您可以通过检查以下变量来查看您的个人资料位置:

$profile.AllUsersAllHosts
$profile.AllUsersCurrentHost
$profile.CurrentUserAllHosts
$profile.CurrentUserCurrentHost

或者,如果您不能或不想使用配置文件方法,您可以将 $env:PATH 突变烘焙到需要它的脚本中。关键是修改PATH变量有效回避了这个问题。

您也可以在其中一个配置文件中设置 git 别名,就像在 中执行的那样,以避免在每个脚本中都必须这样做。

使用 Get-Command 解析两个二进制文件,然后使用 Set-Alias 隐藏优先于您需要的那个:

$gitForWindows = Get-Command git -All |Where-Object Source -notlike *cygwin* |Select-Object -First 1
Set-Alias git -Value $gitForWindows.Source