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

2023-11-29

如果我需要帮助git status命令,我可以输入git help status,并返回一个帮助页面,显示名称为“git-status". But "git-status“ 不是命令,命令是git status有一个空格,而不是连字符。

如果我输入git-status or git git-status我收到一个错误。那么为什么帮助页面会调用它git-status?

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


请注意,在开始时(2005-2008,Git 1.6.0),git 子命令被引用为git-xxx, 在你的$PATH.

See Git 1.6.0 发行说明:

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

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

This 2006年主题添加:

我认为有一些历史背景。

我们一开始没有bindir vs execdir区别,但我们想要一个 有一天,我们将不再把所有东西都放进去bindir.
作为解决方案的一部分,发明了“git”包装器,并且作为 这种努力的结果,脚本的某些部分,以及很多 文档页面和示例脚本,丢失了破折号。

从历史上看,git 工具总是想要一切git-*到 可以在用户的PATH,我们很惊讶地看到 100 多个git-*命令在/usr/bin.
这就是为什么“git”包装器和GIT_EXEC_PATH环境被发明了。

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

一致性通过s/git-foo/git foo/g is目标,但那种 的变化会干扰其他真正起作用的补丁 工作,有点无聊,所以没人做批发 清理所有脚本。


在 Git 2.29(2020 年第 4 季度)中,安装过程学会了选择性地省略“git-foo“每个'的可执行文件foo' 内置子命令,只有那些仍然依赖于古老的承诺的老前辈才需要这些子命令“git --exec-path“输出到PATH在他们的剧本早期将保留“git-foo“他们写的工作电话。

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

See commit ef60e9f, commit 179227d, commit a8b5355 (21 Sep 2020) by Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit 94de88c, 04 Oct 2020)

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

Signed-off-by: Johannes Schindelin

For a long time already, the non-dashed form of the built-ins is the recommended way to write scripts, i.e. it is better to call git merge [...](man) than to call git-merge [...].

虽然 Git 仍然支持虚线形式(通过硬链接git可执行文件中的虚线名称libexec/git-core/),实际上,这可能几乎是无关紧要的。

然而,我们do关心保持人们的脚本正常运行(即使它们是在开始推荐非破折号形式之前编写的)。

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

$ 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

Also, .zip文件没有对硬链接的任何标准化支持,因此“压缩”可执行文件将导致磁盘使用量增加。 (为了缩小 Windows 版 Git 的“MinGit”变体的大小,该变体作为.zip文件中,硬链接被明确排除。)

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 git 会在每个命令名称前添加“git-”? 的相关文章

  • 如何像对待普通目录一样对待嵌套存储库(子模块)?

    我的 WordPress 网站是使用 Git 进行版本控制的 包括wp content plugins 文件夹 现在有一个插件 wp editormd 带有自己的 Git 存储库 wp content plugins wp editormd
  • 使用 GIT 自动增加 AssemblyFileVersion

    好吧 我知道这可能不是传统的 但除此之外 我使用 AssemblyFileVersion 作为我的 构建名称 字符串 它的格式如下 File Version information for an assembly consists of t
  • 从 git 中删除历史记录 - git 命令失败

    我正在尝试从 Git 历史记录中清除项目 bin 目录 我已经将 bin 添加到 gitignore 并运行 git rm cached r bin成功地 现在我尝试使用 GitHub 帮助页面中推荐的命令来清除历史记录 git filte
  • 具有单独 work_tree 的 Git 子模块

    我按照本页上的教程使通过 Git 部署我的网站变得简单 http toroid org ams git website howto http toroid org ams git website howto 到目前为止一切都很好 但是我最近
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • 有没有办法缓存 https 凭据以推送提交?

    我最近转而将我的存储库同步到 GitHub 上的 https 由于防火墙问题 并且每次都要求输入密码 有没有办法缓存凭据 而不是每次都进行身份验证git push 自 Git 1 7 9 2012 年发布 以来 Git 中有一个巧妙的机制可
  • git 可以与 Xcode 集成吗?

    有没有办法将 git 存储库与 Xcode 内置的 SCM 功能一起使用 Xcode 4 原生支持 git WWDC 2010 上的开发者工具国情咨文演讲 在这里了解更多 Xcode 4 中的新增功能 http developer appl
  • Git 不断提示我输入密码

    我已经使用 Git 一段时间了 但是不断要求输入密码开始让我感到厌烦 我使用的是 Mac OS X 和 GitHub 并且按照 GitHub 的说明设置了 Git 和我的 SSH 密钥设置 Git 页面 http help github c
  • 重新打包存储库对于大型二进制文件有用吗?

    我正在尝试将大量历史记录从 Perforce 转换为 Git 并且一个文件夹 现在是 git 分支 包含大量大型二进制文件 我的问题是运行时内存不足git gc aggressive 我的主要问题是重新打包存储库是否可能对大型二进制文件产生
  • git pull,忽略深度,如何不拉取整个历史记录?

    我们有一个巨大的多 GB git 存储库 主要是二进制对象 克隆需要几天时间 实际的主分支 没有历史记录 只有大约 20MB 所以我想 深度为 1 的 git 克隆就是解决办法 然而 现在我需要将某人的更新拉到主服务器 我们没有分支 当我拉
  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • git reset 命令中的 ~1 是什么意思?

    git 重置 HEAD 1 我的印象是 1 的意思是 从 HEAD 开始 遵循 1 链接 并将 HEAD 标签设置为新的提交节点 我正期待着 git 重置 HEAD 2 跟随 2 个链接 然后设置 HEAD 标签 但是 如果我尝试它 我会收
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My

随机推荐

  • 对于我的情况,如何在 Oracle 中编写 SQL?

    所以 这是表格 create table person id number name varchar2 50 create table injury place id number place varchar2 50 create tabl
  • 如何在 iOS 上获取音频音量级别和音量更改通知?

    我正在编写一个非常简单的应用程序 按下按钮时会播放声音 由于当设备设置为静音时该按钮没有多大意义 因此我想在设备的音量为零时禁用它 然后当音量再次调高时重新启用它 我正在寻找一种可行的 并且 AppStore 安全的 方法检测当前音量设置并
  • 了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

    Web 客户端 服务器身份验证上下文中有关 JWT 的一些声明 JWT 对于中间人攻击并不安全 从安全角度来说 从客户端向服务器发送 JWT 相当于发送哈希密码 JWT 可以携带用户详细信息作为有效负载 使用这些数据而不访问数据库中的实际数
  • 在不规则形状内渲染 CoreText

    我正在寻找有关实现渲染视图的指导NSAttributedString在有孔的多边形内 包裹并重排文本以适应几何形状 它不是CoreText这就是问题所在 但是将不规则形状划分为有序的蹲矩形序列的一般问题 类似的问题尚未得到完全解答 如何在
  • 如何在React Route中传递id

    当我想从产品列表中按 ID 查看产品时 我想构建一个页面 在我的应用程序文件中 我有类似的内容
  • 使用 jQuery 获取边框样式

    我如何使用 jQuery 获得边框样式 以下内容不起作用 get click function var x div css borderStyle alert x Check http jsfiddle net s7YAN 31 alert
  • Mozilla 3.0.8 和 Chrome 高度错误解决方法

    我有一个textarea里面一个div div div
  • 使用大小写“透视”键|值表会返回空白列... mySQL

    我正在尝试将键 值格式的数据转换为每个条目一行 源数据库是 mysql 我知道我需要使用 Case 语句才能进行透视 并且遵循了该站点上的一些示例来构建我的查询 但是 我只返回一列数据 其余列中为空白 源表格式 user id meta k
  • 分配时的 JavaScript 评估顺序

    JavaScript 在什么时候确定赋值的左侧 是在评估右侧之前还是之后 例如 这段代码的作用是什么 var arr thing 1 thing 2 thing 3 last true arr arr length 1 newField a
  • 通过 PHP 或任何其他脚本创建电子邮件地址

    我需要为我的用户创建代理电子邮件地址 电子邮件地址将类似于 email protected 但最好我想要更好看的电子邮件地址 例如 email protected 发送到此地址的电子邮件应转发到用户不会暴露的真实电子邮件地址 例如 emai
  • 无法对数组类型调用 add

    我得到了一些需要修改的代码 这是一个囚徒困境游戏 最初玩家被设置了这段代码到一个数组中 IPDPlayer currentPlayers new RandomPlayer new TFTPlayer new TFTPlayer new TF
  • 如何在pyglet中连续播放音乐

    我和我的朋友正在开发一款游戏 我们希望音乐在游戏运 行时循环播放 求助 好像没有重复播放音乐的功能 在当前版本的 pyglet 中 您应该使用SourceGroup 设置loop归因于True 然后您可以将其排队到Player播放它 snd
  • javascript倒计时器暂停恢复

    起初 我的倒计时器没有暂停和恢复功能 并且计时器运行得很好 现在我刚刚添加了该功能 暂停没有问题 但恢复时间有问题 时间不会从当前位置开始显示 也不会从那里开始倒计时 如何更改我的代码 pause click function Get cu
  • Android 浮动操作按钮未返回到初始位置

    如果 FAB 浮动操作按钮 在小吃栏出现之前隐藏 在 CoordinatorLayout 中 那么下次我显示 FAB 时 它会在旧位置绘制 不会向下移动到原始位置 如果当小吃栏消失时 FAB 可见 则一切都按预期工作 我错过了什么还是一个错
  • “Set-AzureRmDataFactoryV2”未被识别为 cmdlet 的名称

    我已经在 Ubuntu 16 04 上安装了 Powershell 6 0 0 尝试使用 Powershell 创建 Azure 数据工厂时出现以下错误 Set AzureRmDataFactoryV2 The term Set Azure
  • 获取mp3文件长度

    我目前正在尝试用 C 编写一个音频播放器 我正在使用 BASS 库来处理播放音乐 但现在我在获取歌曲长度方面遇到了小问题 好吧 我读过 BASS 文档并找到了一种方法 我需要做的 所有 就是 int stream Bass BASS Str
  • 使用 Containable 对关联模型 (HABTM) 上的条件过滤的结果进行分页

    我需要对列表进行分页Products 属于特定Category HABTM 协会 In my Product我有的型号 var actsAs array Containable var hasAndBelongsToMany array C
  • 如何在cmake中链接所有LLVM库?

    我想链接我的 cmake C 项目中的所有 LLVM 库 I use llvm config components为了获得 LLVM 的所有组件 它给了我 llvm config components aarch64 aarch64asmp
  • 使用 Greasemonkey 将日期选择器添加到文本框

    有一个需要日期但没有日期选择器的文本框 我想用 Greasemonkey 添加一个 我寻找一个例子 但找不到 这可能吗 有这样做的例子吗 它不需要很花哨 我喜欢用jQuery UI 的 datepicker 因为我通常都会加载 jQuery
  • 为什么 git 会在每个命令名称前添加“git-”?

    如果我需要帮助git status命令 我可以输入git help status 并返回一个帮助页面 显示名称为 git status But git status 不是命令 命令是git status有一个空格 而不是连字符 如果我输入g