使用除
version
之外的命令。例如,尝试将
l
别名为
log
。(或者,正如VonC所指出的那样,升级 - 它实际上在现代Git中有效。别名处理似乎在2.17.3和2.18.0之间已被重写。)
为什么
l = log
可以工作,但
v = version
不行呢?
这有点棘手!
大多数Git命令是单独的程序,它们安装到一个目录(或文件夹)中,而该目录/文件夹包含“您可以运行的Git命令”。例如,
git log
实际上是由一个名为
git-log
的命令实现的,该命令安装在特殊的目录/文件夹中。
但是,您通常不会从此目录/文件夹中运行命令。
在遥远的过去,这些Git命令 -
git-log
,
git-commit
,
git-add
,
git-diff
等 - 都是直接安装的,并且您可以通过键入
git-something
来直接运行它们。这对bash的自动补全功能运行良好,因为您可以键入
git-comTAB
以获取提交命令,或者键入
git-chTAB
以获取检出命令。但是随着时间的推移,Git命令的数量增长(
git-cherry
和
git-cherry-pick
),并且不断增长,甚至输入完整的命令
git-add
也不足够了,因为还有例如
git-add--interactive
,因此
TAB补全基本上完全停止工作。
做出了一个决定:Git不会停止提供57个不同的命令 - 实际上现在已经超过150个了 - 但是,所有这些各种的实现命令将被塞到一个地方,那里它们将不会总是出现在您的面前。单个前端命令
git
可以让您将命令作为参数键入到前端
git
命令中:
git com
然后
TAB:bash现在有一个允许的完成列表,并且只选择
commit
,因为那是您要使用的唯一
com
,而不是只有脚本经常使用的
git-commit-tree
或
git-commit-graph
后端程序。
所以:前端
git
命令知道如何查找和运行所有各种后端实现。按照惯例,大多数后端实现都在
git-core
目录中:运行
git --exec-path
前端打印出所有后端程序实际存在的位置的名称。(如果您喜欢,可以在那里查看它们,甚至直接从那里运行它们,尽管现在前端的git命令会设置后端命令可能需要的信息。)但是`git version`呢?既然您现在知道Git命令实际上存在于系统中的`git-core`文件夹中,无论该文件夹位于何处,我建议您在其中查找`git-version`程序。你会发现在里面有`git-checkout`,`git-log`,`git-commit`,`git-diff`和许多其他命令,但
你不会找到`git-version`。根本没有。 `version`命令直接内置在前端中。别名仅在调用后端命令时才起作用。因此是没有办法使用别名来执行`version`命令的。(显然,在2.9版本之后和2.24版本之前的某个时候,别名处理代码变得更加智能化,也考虑到了前端内置的命令。)
还有一件重要的事情需要知道。前端git命令知道一些常见的后端命令,但它并没有完整的后端命令列表。当您键入`git asdf`或`git rumplestiltskin`或`git helloworld`时,(这些都不是实际的Git命令),它会像往常一样设置一切,然后尝试运行`git-asdf`或`git-rumplestiltskin`或`git-helloworld`,同时告诉系统查找`git-core`目录。它没有告诉系统不要在其他目录中查找。
这意味着您可以编写自己的Git命令。如果您想要一个`git asdf`,您可以编写自己的`git-asdf`程序,并将其放在任何位置,以便运行`git-asdf`成功。现在您可以使用`git asdf`来运行它了。
您可能想知道为什么要这样做?如果您在个人bin或scripts文件夹中安装`git-asdf`,则可以直接运行`git-asdf`。事实上,您确实可以这样做。但是当您让前端运行它时,您将得到提供特殊Git设置信息的能力。主要的助手称为`git-sh-setup`,您可以通过“sourcing”它来调用它,使用`.`(POSIX)或`source`(bash):
#! /bin/sh
. git-sh-setup
这将添加shell函数die
、say
、git_pager
、require_clean_work_tree
等等。如果在源代码中导入git-sh-setup
之前设置了shell变量OPTIONS_SPEC
,它将为您解析参数。查看脚本,就在git-core
目录中,了解如何使用它。
(请注意,像Git的所有事物一样,它随着时间的推移而增长。例如,在Git 1.7时代,它的功能比现在少。如果您想要向旧版Git进行回溯兼容,请克隆Git存储库,选择一个兼容级别,并使用git checkout
命令查看旧版本以确定可以依赖的内容。)
log
也不起作用。请参见我上面更新的问题中的“更新1”。 - Will Hainsgit --exec-path
显示什么?显示的目录中包含什么内容?(您可能安装了错误版本的 Git。) - torekgit --exec-path
报告的目录与安装目录不同。我尝试在.bashrc
中设置GIT_EXEC_PATH
,但没有解决问题,最后我按照这些说明从源代码构建并安装到$HOME/bin
中。现在一切都正常了。你的回答主体实际上没有解决问题,但是你上面的最后一条评论解决了问题,所以我会将此答案标记为已接受。再次感谢,@torek! - Will Hains