为什么 git 帮助在每个命令名称之前添加“git-”?

mar*_*rkg 5 git

如果我需要git status命令的帮助,我可以输入git help status,然后返回一个帮助页面,上面写着名称是“ git-status”。但是“ git-status”不是命令,命令是git status带空格的,不是连字符。

如果我输入git-statusgit git-status出现错误。那么为什么帮助页面会调用它git-status呢?

Git 对帮助页面中的每个命令都执行相同的操作。为什么?

Von*_*onC 4

请注意,在开始时(2005-2008 年,Git 1.6.0),git 子命令git-xxx在您的$PATH.

请参阅Git 1.6.0 发行说明

使用默认Makefile设置,大多数程序现在都安装在您的外部$PATH,除了“ git”、“ gitk”和一些由于技术原因需要访问的服务器端程序。

自 2006 年初以来,从命令行调用 git 子命令“ git-xyzzy”已被弃用(并在1.5.4 发行说明中正式宣布)。此版本仍然支持将“ ”的
输出添加到脚本中后使用它们,但再次强烈鼓励用户调整其脚本以使用“ ”形式,因为我们将停止为内置命令安装“”硬链接在以后的版本中。git --exec-path$PATHgit xyzzygit-xyzzy

这个2006 年的帖子添加了

我认为有一些历史背景。

我们一开始没有bindir任何execdir区别,但我们希望有一天能够摆脱将所有内容都放入bindir.
作为解决方案的一部分,发明了“git”包装器,由于这一努力,脚本的某些部分以及大量文档页面和示例脚本丢失了破折号。

从历史上看,git 工具一直希望git-*在用户的 中找到所有内容PATH,我们很惊讶地git-* 看到/usr/bin.
这就是GIT_EXEC_PATH发明“git”包装器和环境的原因。

人们可以在他们的 .git 上拥有/usr/bin/git其他命令,因为“git”知道在哪里可以找到其余命令。 为了实现这一点,脚本应该知道在哪里可以找到其余的——最干净的方法是通过“git foo”形式运行其他脚本。git-*PATHgit-*

一致性s/git-foo/git foo/g 我们的目标,但这种改变会干扰其他真正工作的补丁,而且有点无聊,所以没有人对所有脚本进行大规模清理。


在 Git 2.29(2020 年第 4 季度)中,安装过程学会了选择性地省略git-foo每个“”foo内置子命令的“”可执行文件,只有老用户才需要这些文件,因为他们仍然依赖于古老的承诺,即在前面添加“ git --exec-path”输出到PATH早期在他们的脚本中将保持他们编写的“ git-foo”调用正常工作。

从磁盘中删除这些可执行文件的旧尝试在 1.6 时代失败了;稍后可能值得再次尝试。

请参阅Johannes Schindelin ( )的提交 ef60e9f提交 179227d提交 a8b5355(2020 年 9 月 21 日)。(由Junio C Hamano 合并 -- --提交 94de88c中,2020 年 10 月 4 日)dscho
gitster

Git:可选择跳过链接/复制内置程序

签署人:约翰内斯·辛德林

很长一段时间以来,内置函数的非破折号形式是编写脚本的推荐方式,即调用( man )比调用更好。git merge [...]git-merge [...]

虽然 Git 仍然支持破折号形式(通过将git可执行文件硬链接到 中的破折号名称libexec/git-core/),但实际上,它可能几乎无关紧要。

然而,我们确实关心让人们的脚本正常工作(即使它们是在开始推荐非破折号形式之前编写的)。

不过,保持这种向后兼容性并不一定便宜:即使修改git.git checkout 中的提示提交也需要重新链接所有这些虚线命令。
在这位开发人员的笔记本电脑上,这会产生明显的差异:

$ touch version.c && time make
    CC version.o
    AR libgit.a
    LINK git-bugreport.exe
    [... 11 similar lines ...]
    LN/CP git-remote-https.exe
    LN/CP git-remote-ftp.exe
    LN/CP git-remote-ftps.exe
    LINK git.exe
    BUILTIN git-add.exe
    [... 123 similar lines ...]
    BUILTIN all
    SUBDIR git-gui
    SUBDIR gitk-git
    SUBDIR templates
    LINK t/helper/test-fake-ssh.exe
    LINK t/helper/test-line-buffer.exe
    LINK t/helper/test-svn-fe.exe
    LINK t/helper/test-tool.exe



real    0m36.633s
user    0m3.794s
sys     0m14.141s



$ touch version.c && time make SKIP_DASHED_BUILT_INS=1
    CC version.o
    AR libgit.a
    LINK git-bugreport.exe
    [... 11 similar lines ...]
    LN/CP git-remote-https.exe
    LN/CP git-remote-ftp.exe
    LN/CP git-remote-ftps.exe
    LINK git.exe
    BUILTIN git-receive-pack.exe
    BUILTIN git-upload-archive.exe
    BUILTIN git-upload-pack.exe
    BUILTIN all
    SUBDIR git-gui
    SUBDIR gitk-git
    SUBDIR templates
    LINK t/helper/test-fake-ssh.exe
    LINK t/helper/test-line-buffer.exe
    LINK t/helper/test-svn-fe.exe
    LINK t/helper/test-tool.exe



real    0m23.717s
user    0m1.562s
sys     0m5.210s
Run Code Online (Sandbox Code Playgroud)

此外,.zip文件没有任何对硬链接的标准化支持,因此“压缩”可执行文件将导致磁盘使用量增加。(为了减小 Windows 版 Git 的“MinGit”变体的大小(它以文件形式分发).zip,硬链接被专门排除在外。)

除此之外,一些经常用于评估磁盘使用情况的程序无法意识到这些是硬链接,并且严重超出了磁盘使用情况。
最值得注意的是,直到最后几个 Windows 10 版本之前,Windows 资源管理器都是这种情况。参见例如msysgit/msysgit第58期

为了节省硬链接这些虚线命令所需的时间,并计划最终停止在 Windows 上提供这些硬链接,让我们引入一个 Makefile 旋钮来跳过生成它们。