git --version命令返回与实际安装不同的结果

4
尝试使用Homebrew更新Git时,我遇到了这个问题:
MBP:GitHub_Tutorial nasdas$ brew install git
Warning: git 2.21.0 is already installed and up-to-date
To reinstall 2.21.0, run `brew reinstall git`
MBP:GitHub_Tutorial nasdas$ git --version
git version 2.17.2 (Apple Git-113)

2
运行 hash -r 然后运行which git。输出是什么? - Greg Bacon
/usr/local/bin/git - user3545063
更有趣的是,在运行了hash -r之后,现在当我运行git --version时,它显示了正确的git版本。 - user3545063
1个回答

7
我猜你已经安装了两个版本,它们是相互独立的。

使用type gitwhich git来查看你正在运行哪一个。可能是/usr/bin/git。而通过brew安装的可能是/usr/local/bin/git。更改你的$PATH(或$path或者其他你的shell使用的变量)以将/usr/local/bin放在/usr/bin之前,这样git将运行新版本而不是旧版本,或者使用/usr/local/bin/git来运行新版本。

(并且,正如Greg Bacon在评论中指出的那样,请注意,如果在/usr/local/bin安装了某些内容,而它们已经决定git代表/usr/bin/git,即使$PATH提前包含了/usr/local/bin,你可能需要在各种shell中运行hash -r来让它们重新检查。在csh/tcsh中,这是使用rehash命令代替hash -r命令。)

(结果证明这是一个哈希问题 - 早些时候,您的shell已经将git解释为旧版本。重新登录也可以解决此类问题,但很麻烦!)


好的,感谢您澄清!‘$PATH’是什么?我猜测brew会将软件包安装在本地用户帐户上而不是全局上?正如您所看到的,我仍然非常新于shell命令,所以我很乐意学习更多。 - user3545063
2
$PATH是一个shell变量和环境变量(shell倾向于将两者混合在一起,现在只需要知道它是两者都是即可),shell使用它来决定如何运行命令。也就是说,你输入像 gronk fleeble1 fleeble2 这样的命令。shell不知道这意味着什么:它只是尝试找到名为 gronk 的可执行程序,并将这两个参数传递给它去解决。但是shell会在哪里找到 gronk 呢?答案是:它逐个查看 $PATH 的每个元素。[续] - torek
2
$PATH 可能被设置为 /usr/local/bin:/bin:/usr/bin 等路径。因此,shell 会尝试运行 /usr/local/bin/gronk,但这可能会失败。然后它会尝试 /bin/gronk,这也可能失败,最后尝试 /usr/bin/gronk,这可能同样失败,然后放弃并显示 gronk: not found。但是,如果其中一个成功了,那么 shell 就知道了 gronk 的位置,并且下次可以直接到达那里。这就是加速后续运行相同程序的 "哈希"。 - torek
2
你可以编写自己的命令并将它们放在一个目录中,然后将该目录添加到您的$PATH中,这样您就可以运行自己的命令了。我在我的电脑上有两个这样的目录:一个用于二进制文件(必须为每个机器架构编译,例如x86 vs arm或powerpc),另一个用于脚本(在所有机器上都可以使用)。二进制目录是$HOME/bin.$arch,其中$HOME是一个shell+env变量,$arch是我自己设置的一个shell变量。脚本目录是$HOME/scripts。我可以在不同的机器上使用相同的主目录。 - torek
2
哈希技巧在$PATH变得非常长时变得重要。我的一个机器上有11个元素,另一个机器上有16个元素... - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接