简体中文 ▾ 主题 ▾ 最新版本 ▾ git 最近更新于 2.55.0

名称

git - 极傻的内容跟踪器

概要

git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
    [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
    [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]
    [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]
    [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]
    <command> [<args>]

描述

Git 是一个快速、可扩展、分布式的版本控制系统,拥有异常丰富的命令集,既提供了高级操作,又提供了对内部机制的完整访问。

请参阅 gittutorial[7] 以开始使用,然后参阅 giteveryday[7] 获取实用的最小命令集。Git 用户手册 提供了更深入的介绍。

在掌握了基本概念后,您可以回到此页面了解 Git 提供的命令。您可以通过 "git help <command>" 了解各个 Git 命令的更多信息。gitcli[7] 手册页为您提供了命令行命令语法的概述。

最新 Git 文档的格式化和超链接版本可在 https://git.github.io/htmldocs/git.htmlhttps://git-scm.cn/docs 查看。

选项

-v
--version

打印 git 程序所属的 Git 套件版本。

此选项在内部转换为 git version ...,并接受与 git-version[1] 命令相同的选项。如果同时提供了 --help,则其优先级高于 --version

-h
--help

打印大纲和最常用命令的列表。如果提供了选项 --all-a,则会打印所有可用命令。如果指定了某个 Git 命令,此选项将显示该命令的手册页。

还有其他选项可用于控制手册页的显示方式。有关更多信息,请参阅 git-help[1],因为 git --help ... 会在内部转换为 git help ...

-C <path>

运行效果就如同 git 是在 <path>(而非当前工作目录)中启动的一样。当提供多个 -C 选项时,每个后续的非绝对 -C <path> 都会被解释为相对于前一个 -C <path> 的路径。如果 <path> 存在但为空,例如 -C "",则当前工作目录保持不变。

此选项会影响需要路径名参数的选项,例如 --git-dir--work-tree,因为它们对路径名的解释将相对于由 -C 选项所指定的工作目录。例如,以下调用是等效的

git --git-dir=a.git --work-tree=b -C c status
git --git-dir=c/a.git --work-tree=c/b status
-c <name>=<value>

向命令传递一个配置参数。给定的值将覆盖配置文件中的值。<name> 的格式应与 git config 列出的格式相同(子键用点分隔)。

注意,在 git -c foo.bar ... 中省略 = 是允许的,这会将 foo.bar 设置为布尔真值(就像配置文件中的 [foo]bar 一样)。如果包含等号但值为空(例如 git -c foo.bar= ...),则会将 foo.bar 设置为空字符串,git config --type=bool 会将其转换为 false

--config-env=<name>=<envvar>

类似于 -c <name>=<value>,为配置变量 <name> 指定一个值,其中 <envvar> 是获取该值对应的环境变量名称。与 -c 不同,这里没有直接将值设置为空字符串的捷径,而是必须将环境变量本身设置为空字符串。如果环境中不存在 <envvar>,则会报错。<envvar> 不能包含等号,以避免与包含等号的 <name> 产生歧义。

这适用于您希望向 git 传递临时配置选项,但所使用的操作系统可能允许其他进程读取您的命令行(例如 /proc/self/cmdline)却无法读取您的环境(例如 /proc/self/environ)的情况。在 Linux 上,这种行为是默认的,但在您的系统上可能并非如此。

请注意,这可能会提高诸如 http.extraHeader 之类变量的安全性(其敏感信息是值的一部分),但对于诸如 url.<base>.insteadOf 之类的变量则不然(其敏感信息可能是键的一部分)。

--exec-path[=<path>]

您的核心 Git 程序安装的路径。这也可以通过设置 GIT_EXEC_PATH 环境变量来控制。如果未提供路径,git 将打印当前设置然后退出。

--html-path

打印 Git HTML 文档的安装路径(末尾不带斜杠)并退出。

--man-path

打印此版本 Git 的手册页路径 manpath(参见 man(1))并退出。

--info-path

打印安装此版本 Git 的 Info 文档文件的路径并退出。

-p
--paginate

如果标准输出是终端,则将所有输出通过管道传输到 less(或已设置的 $PAGER)。这会覆盖 pager.<cmd> 配置选项(参见下文的“配置机制”部分)。

-P
--no-pager

不将 Git 输出传输到分页器中。

--git-dir=<path>

设置仓库(\".git\" 目录)的路径。这也可以通过设置 GIT_DIR 环境变量来控制。它可以是绝对路径,也可以是相对于当前工作目录的相对路径。

使用此选项(或 GIT_DIR 环境变量)指定 \".git\" 目录的位置会关闭仓库自动发现机制(该机制会尝试寻找含有 \".git\" 子目录的目录,以此发现仓库和工作区顶层),并告诉 Git 您处于工作区的最顶层。如果您不在工作区的顶层目录,则应使用 --work-tree=<path> 选项(或 GIT_WORK_TREE 环境变量)告诉 Git 工作区的顶层在哪里。

如果您只想运行 git 就像它在 <path> 中启动一样,请使用 git -C <path>

--work-tree=<path>

设置工作区的路径。它可以是绝对路径,也可以是相对于当前工作目录的路径。这也可以通过设置 GIT_WORK_TREE 环境变量和 core.worktree 配置变量来控制(更多详细讨论请参见 git-config[1] 中的 core.worktree)。

--namespace=<path>

设置 Git 命名空间。详情请参见 gitnamespaces[7]。等同于设置 GIT_NAMESPACE 环境变量。

--bare

将仓库视为裸仓库。如果未设置 GIT_DIR 环境变量,则会将其设置为当前工作目录。

--no-replace-objects

不使用替换引用(replacement refs)来替换 Git 对象。这等同于导出含有任意值的 GIT_NO_REPLACE_OBJECTS 环境变量。有关更多信息,请参阅 git-replace[1]

--no-lazy-fetch

不按需从承兑远程仓库(promisor remote)获取缺失的对象。与 git cat-file -e <object> 结合使用很有用,可查看该对象在本地是否可用。这等同于将 GIT_NO_LAZY_FETCH 环境变量设置为 1

--no-optional-locks

不执行需要锁的可选操作。这等同于将 GIT_OPTIONAL_LOCKS 设置为 0

--no-advice

禁用打印所有建议提示。

--literal-pathspecs

按字面意思处理路径规格(pathspecs)(即无通配符,无路径规格魔法)。这等同于将 GIT_LITERAL_PATHSPECS 环境变量设置为 1

--glob-pathspecs

将 "glob" 魔法应用到所有路径规格。这等同于将 GIT_GLOB_PATHSPECS 环境变量设置为 1。要对单个路径规格禁用通配,可以使用路径规格魔法 \":(literal)\"。

--noglob-pathspecs

将 "literal" 魔法应用到所有路径规格。这等同于将 GIT_NOGLOB_PATHSPECS 环境变量设置为 1。要对单个路径规格启用通配,可以使用路径规格魔法 \":(glob)\"。

--icase-pathspecs

将 "icase"(忽略大小写)魔法应用到所有路径规格。这等同于将 GIT_ICASE_PATHSPECS 环境变量设置为 1

--list-cmds=<group>[,<group>…​]

按组列出命令。这是一个内部/实验性选项,未来可能会更改或删除。支持的组有:builtins(内置命令)、parseopt(使用 parse-options 的内置命令)、deprecated(已弃用的内置命令)、main(libexec 目录中的所有命令)、others($PATH 中具有 git- 前缀的所有其他命令)、list-<category>(参见 command-list.txt 中的类别)、nohelpers(排除辅助命令)、alias(别名)和 config(从配置变量 completion.commands 中检索命令列表)。

--attr-source=<tree-ish>

<tree-ish> 而非工作区中读取 gitattributes。参见 gitattributes[5]。这等同于设置 GIT_ATTR_SOURCE 环境变量。

GIT 命令

我们将 Git 分为高级("porcelain",瓷器)命令和低级("plumbing",管件)命令。关于定义命令别名,请参见 git-config[1] 并查找对 alias.* 的描述。关于安装自定义 "git" 子命令,请参见本手册中对 PATH 环境变量的描述。

高级命令(porcelain)

我们将 porcelain 命令分为主要命令和一些辅助用户工具。

主要 porcelain 命令

git-add[1]

将文件内容添加到索引

git-am[1]

应用来自邮箱的一系列补丁

git-archive[1]

从指定的树创建文件归档

git-backfill[1]

在部分克隆中下载缺失的对象

git-bisect[1]

使用二分查找定位引入 Bug 的提交

git-branch[1]

列出、创建或删除分支

git-bundle[1]

通过归档移动对象和引用

git-checkout[1]

切换分支或恢复工作区文件

git-cherry-pick[1]

应用一些现有提交所引入的更改

git-citool[1]

git-commit 的图形化替代方案

git-clean[1]

从工作区中删除未跟踪的文件

git-clone[1]

克隆仓库到新目录中

git-commit[1]

将更改记录到仓库中

git-describe[1]

根据可用的引用给对象起一个人类易读的名字

git-diff[1]

显示提交之间、提交与工作区等之间的差异

git-fetch[1]

从另一个仓库下载对象和引用

git-format-patch[1]

准备补丁以便通过电子邮件提交

git-gc[1]

清理无用文件并优化本地仓库

git-grep[1]

打印匹配模式的行

git-gui[1]

一个便携式 Git 图形界面

git-history[1]

实验性:重写历史

git-init[1]

创建一个空的 Git 仓库或重新初始化一个已存在的仓库

git-log[1]

显示提交日志

git-maintenance[1]

运行任务以优化 Git 仓库数据

git-merge[1]

将两个或多个开发历史合并在一起

git-mv[1]

移动或重命名文件、目录或符号链接

git-notes[1]

添加或检查对象备注

git-pull[1]

从另一个仓库或本地分支获取并整合

git-push[1]

更新远程引用及相关对象

git-range-diff[1]

比较两个提交范围(例如一个分支的两个版本)

git-rebase[1]

在另一个基底端点之上重新应用提交

git-reset[1]

HEAD 或索引设置为已知状态

git-restore[1]

恢复工作区文件

git-revert[1]

还原一些现有的提交

git-rm[1]

从工作区和索引中删除文件

git-shortlog[1]

汇总 git log 的输出

git-show[1]

显示各种类型的对象

git-sparse-checkout[1]

将您的工作区缩减为已跟踪文件的一个子集

git-stash[1]

储藏脏工作区中的更改

git-status[1]

显示工作区状态

git-submodule[1]

初始化、更新或检查子模块

git-switch[1]

切换分支

git-tag[1]

创建、列出、删除或验证标签

git-worktree[1]

管理多个工作区

gitk[1]

Git 仓库浏览器

scalar[1]

一个用于管理大型 Git 仓库的工具

辅助命令

操作命令

git-config[1]

获取和设置仓库或全局选项

git-fast-export[1]

Git 数据导出工具

git-fast-import[1]

快速 Git 数据导入工具的后端

git-filter-branch[1]

重写分支

git-mergetool[1]

运行合并冲突解决工具来解决合并冲突

git-pack-refs[1]

打包分支端点(heads)和标签以实现高效的仓库访问

git-prune[1]

从对象数据库中清除所有不可达的对象

git-reflog[1]

管理引用日志(reflog)信息

git-refs[1]

对引用的低级访问

git-remote[1]

管理已跟踪仓库的集合

git-repack[1]

打包仓库中未打包的对象

git-replace[1]

创建、列出、删除用于替换对象的引用

查询命令

git-annotate[1]

用提交信息标注文件行

git-blame[1]

显示文件的每一行最后是由哪个版本和作者修改的

git-bugreport[1]

收集信息供用户提交 Bug 报告

git-count-objects[1]

计算未打包对象的数量及其磁盘消耗

git-diagnose[1]

生成诊断信息的 zip 归档

git-difftool[1]

使用常用的差异对比工具显示更改

git-fsck[1]

验证数据库中对象的连接性和有效性

git-help[1]

显示关于 Git 的帮助信息

git-instaweb[1]

在 gitweb 中即时浏览您的工作仓库

git-merge-tree[1]

在不触动索引或工作区的情况下执行合并

git-rerere[1]

重用记录的冲突合并解决方案

git-show-branch[1]

显示分支及其提交

git-verify-commit[1]

检查提交的 GPG 签名

git-verify-tag[1]

检查标签的 GPG 签名

git-version[1]

显示 Git 的版本信息

git-whatchanged[1]

显示每次提交引入差异的日志

gitweb[1]

Git Web 接口(Git 仓库的 Web 前端)

与其他系统和人交互

这些命令用于与其他版本控制系统(SCM)交互,以及通过电子邮件发送补丁与其他人交互。

git-archimport[1]

将 GNU Arch 仓库导入 Git

git-cvsexportcommit[1]

将单个提交导出到 CVS 工作副本中

git-cvsimport[1]

从另一个人们又爱又恨的 SCM 中挽救您的数据

git-cvsserver[1]

适用于 Git 的 CVS 服务器模拟器

git-imap-send[1]

从标准输入将一系列补丁发送到 IMAP 文件夹

git-p4[1]

与 Perforce 仓库进行导入和提交操作

git-quiltimport[1]

将 quilt 补丁集应用到当前分支

git-request-pull[1]

生成待处理更改的汇总

git-send-email[1]

将一系列补丁作为电子邮件发送

git-svn[1]

在 Subversion 仓库和 Git 之间进行双向操作

重置、恢复和还原

有三个名字类似的命令:git resetgit restoregit revert

  • git-revert[1] 用于创建一个新提交,以撤销其他提交所做的更改。

  • git-restore[1] 用于从索引或其他提交中恢复工作区文件。此命令不会更新您的分支。该命令还可用于从其他提交中恢复索引中的文件。

  • git-reset[1] 用于更新您的分支,通过移动端点来向分支添加或从中删除提交。此操作会改变提交历史。

    git reset 也可用于恢复索引,这与 git restore 的功能有所重合。

低级命令(plumbing)

尽管 Git 包含了自己的 porcelain 层,但其低级命令足以支持开发替代的 porcelain。这些 porcelain 的开发者可以从阅读 git-update-index[1]git-read-tree[1] 开始。

这些低级命令的接口(输入、输出、选项集和语义)旨在比 Porcelain 级别的命令更加稳定,因为这些命令主要用于脚本编写。相反,Porcelain 命令的接口为了改善最终用户体验,可能会发生变化。

以下描述将低级命令分为:操作(仓库、索引和工作区中)对象的命令,查询和比较对象的命令,以及在仓库之间移动对象和引用的命令。

操作命令

git-apply[1]

向文件和/或索引应用补丁

git-checkout-index[1]

将文件从索引复制到工作区

git-commit-graph[1]

写入并验证 Git 提交图(commit-graph)文件

git-commit-tree[1]

创建一个新的提交对象

git-hash-object[1]

计算对象 ID,并可选地从文件创建对象

git-index-pack[1]

为现有的打包归档文件构建包索引文件

git-merge-file[1]

运行三路文件合并

git-merge-index[1]

为需要合并的文件运行合并

git-mktag[1]

创建带有额外验证的标签对象

git-mktree[1]

从 ls-tree 格式的文本构建树对象

git-multi-pack-index[1]

写入并验证多包索引

git-pack-objects[1]

创建对象的打包归档

git-prune-packed[1]

删除已存在于包文件中的多余对象

git-read-tree[1]

将树信息读取到索引中

git-replay[1]

实验性:在新基底上重放提交,也适用于裸仓库

git-symbolic-ref[1]

读取、修改和删除符号引用

git-unpack-objects[1]

从打包归档中解包对象

git-update-index[1]

将工作区中的文件内容注册到索引中

git-update-ref[1]

安全地更新存储在引用中的对象名称

git-write-tree[1]

从当前索引创建树对象

查询命令

git-cat-file[1]

提供仓库对象的内容或详细信息

git-cherry[1]

查找尚未应用到上游的提交

git-diff-files[1]

比较工作区和索引中的文件

git-diff-index[1]

将树与工作区或索引进行比较

git-diff-pairs[1]

比较提供的 blob 对的内容和模式

git-diff-tree[1]

比较通过两个树对象找到的 blob 的内容和模式

git-for-each-ref[1]

输出每个引用的信息

git-for-each-repo[1]

在仓库列表上运行 Git 命令

git-format-rev[1]

实验性:按需美化格式化版本

git-get-tar-commit-id[1]

从使用 git-archive 创建的归档文件中提取提交 ID

git-last-modified[1]

实验性:显示文件的最后修改时间

git-ls-files[1]

显示索引和工作区中文件的信息

git-ls-remote[1]

列出远程仓库中的引用

git-ls-tree[1]

列出树对象的内容

git-merge-base[1]

为合并寻找尽可能好的共同祖先

git-name-rev[1]

查找给定版本的符号名称

git-pack-redundant[1]

查找冗余的包文件

git-repo[1]

检索有关仓库的信息

git-rev-list[1]

按逆时间顺序列出提交对象

git-rev-parse[1]

拣选并整理参数

git-show-index[1]

显示打包归档索引

git-show-ref[1]

列出本地仓库中的引用

git-unpack-file[1]

用 blob 的内容创建一个临时文件

git-var[1]

显示 Git 逻辑变量

git-verify-pack[1]

验证打包的 Git 归档文件

通常,查询命令不会触动工作区中的文件。

同步仓库

git-daemon[1]

一个用于 Git 仓库的简易服务器

git-fetch-pack[1]

从另一个仓库接收缺失的对象

git-http-backend[1]

Git over HTTP 的服务端实现

git-send-pack[1]

通过 Git 协议向另一个仓库推送对象

git-update-server-info[1]

更新辅助信息文件以帮助哑服务器(dumb servers)

以下是上述命令使用的辅助命令;最终用户通常不直接使用它们。

git-http-fetch[1]

通过 HTTP 从远程 Git 仓库下载

git-http-push[1]

通过 HTTP/DAV 向另一个仓库推送对象

git-receive-pack[1]

接收推送到仓库中的内容

git-shell[1]

仅用于 Git SSH 访问的受限登录 shell

git-upload-archive[1]

将归档发送回 git-archive

git-upload-pack[1]

将打包的对象发送回 git-fetch-pack

内部辅助命令

这些是其他命令使用的内部辅助命令;最终用户通常不直接使用它们。

git-check-attr[1]

显示 gitattributes 信息

git-check-ignore[1]

调试 gitignore / 排除文件

git-check-mailmap[1]

显示联系人的规范名称和电子邮件地址

git-check-ref-format[1]

确保引用名称格式良好

git-column[1]

以列形式显示数据

git-credential[1]

检索并存储用户凭据

git-credential-cache[1]

在内存中临时存储密码的辅助程序

git-credential-store[1]

在磁盘上存储凭据的辅助程序

git-fmt-merge-msg[1]

生成合并提交消息

git-hook[1]

运行 Git 钩子(hooks)

git-interpret-trailers[1]

在提交消息中添加或解析结构化信息

git-mailinfo[1]

从单个电子邮件中提取补丁和作者信息

git-mailsplit[1]

简单的 UNIX mbox 分割程序

git-merge-one-file[1]

与 git-merge-index 配合使用的标准辅助程序

git-patch-id[1]

计算补丁的唯一 ID

git-sh-i18n[1]

用于 Shell 脚本的 Git 国际化(i18n)设置代码

git-sh-setup[1]

通用的 Git Shell 脚本设置代码

git-stripspace[1]

删除不必要的空格

git-url-parse[1]

解析并提取 Git URL 组件

指南

以下文档页面是关于 Git 概念的指南。

gitcore-tutorial[7]

面向开发者的 Git 核心教程

gitcredentials[7]

向 Git 提供用户名和密码

gitcvs-migration[7]

面向 CVS 用户的 Git

gitdiffcore[7]

调整 diff 输出

giteveryday[7]

日常 Git 的实用最小命令集

gitfaq[7]

关于使用 Git 的常见问题

gitglossary[7]

Git 术语表

gitnamespaces[7]

Git 命名空间

gitremote-helpers[7]

与远程仓库交互的辅助程序

gitsubmodules[7]

将一个仓库挂载到另一个仓库内

gittutorial[7]

Git 教程入门

gittutorial-2[7]

Git 教程入门:第二部分

gitworkflows[7]

推荐的 Git 工作流概述

仓库、命令和文件接口

本篇文档讨论了用户直接交互的仓库和命令接口。关于判定标准的更多详细信息,请参见 git-help[1] 中的 --user-formats

gitattributes[5]

按路径定义属性

gitcli[7]

Git 命令行界面和规范

githooks[5]

Git 使用的钩子

gitignore[5]

指定故意忽略且不进行跟踪的文件

gitmailmap[5]

映射作者/提交者名称和/或电子邮件地址

gitmodules[5]

定义子模块属性

gitrepository-layout[5]

Git 仓库布局

gitrevisions[7]

为 Git 指定版本和范围

文件格式、协议和其他开发者接口

本篇文档讨论了文件格式、传输协议以及其他 Git 开发者接口。参见 git-help[1] 中的 --developer-interfaces

gitformat-bundle[5]

bundle 文件格式

gitformat-chunk[5]

基于块(Chunk)的文件格式

gitformat-commit-graph[5]

Git 提交图格式

gitformat-index[5]

Git 索引格式

gitformat-pack[5]

Git 包(pack)格式

gitformat-signature[5]

Git 加密签名格式

gitprotocol-capabilities[5]

协议 v0 和 v1 特性(capabilities)

gitprotocol-common[5]

各种协议的通用事项

gitprotocol-http[5]

基于 HTTP 的 Git 协议

gitprotocol-pack[5]

包如何在网络上传输

gitprotocol-v2[5]

Git 有线协议版本 2

配置机制

Git 使用简单的文本格式来存储针对每个仓库以及每个用户的自定义设置。这样的配置文件可能看起来像这样

#
# A '#' or ';' character indicates a comment.
#

; core variables
[core]
	; Don't trust file modes
	filemode = false

; user identity
[user]
	name = "Junio C Hamano"
	email = "gitster@pobox.com"

各种命令从配置文件中读取设置并相应地调整其运行。有关配置机制的列表和更多详细信息,请参见 git-config[1]

标识符术语

<object>

表示任何类型对象的对象名称。

<blob>

表示一个 blob 对象名称。

<tree>

表示一个树(tree)对象名称。

<commit>

表示一个提交(commit)对象名称。

<tree-ish>

表示一个树(tree)、提交(commit)或标签(tag)对象名称。接受 <tree-ish> 参数的命令最终希望操作一个 <tree> 对象,但会自动解引用指向该树的 <commit><tag> 对象。

<commit-ish>

表示一个提交(commit)或标签(tag)对象名称。接受 <commit-ish> 参数的命令最终希望操作一个 <commit> 对象,但会自动解引用指向该提交的 <tag> 对象。

<type>

表示需要一个对象类型。目前为以下之一:blobtreecommittag

<file>

表示一个文件名——几乎总是相对于 GIT_INDEX_FILE 所描述的树结构的根目录。

符号标识符

任何接受 <object> 的 Git 命令也可以使用以下符号表示法

HEAD

表示当前分支的端点(head)。

<tag>

一个有效的标签 名称(即 refs/tags/<tag> 引用)。

<head>

一个有效的分支端点 名称(即 refs/heads/<head> 引用)。

关于表示对象名称更完整的列表,请参见 gitrevisions[7] 中的“指定版本(SPECIFYING REVISIONS)”部分。

文件/目录结构

请参见 gitrepository-layout[5] 文档。

关于每个钩子的更多细节,请阅读 githooks[5]

更高级的版本控制系统(SCM)可能会在 $GIT_DIR 中提供和管理额外的信息。

术语

请参见 gitglossary[7]

环境变量

各种 Git 命令会关注环境变量并改变其行为。标记为“布尔”的环境变量与其对应的布尔配置变量的取值方式相同,即 "true"、"yes"、"on" 和正数被视为 "yes",而 "false"、"no"、"off" 和 "0" 被视为 "no"。

以下是相关变量

系统

HOME

指定用户主目录的路径。在 Windows 上,如果未设置该变量,当 $HOMEDRIVE$HOMEPATH 同时存在时,Git 会将进程环境变量设置为:$HOMEDRIVE$HOMEPATH;否则在 $USERPROFILE 存在时将其设置为 $USERPROFILE

PATH

当用户运行不属于核心 Git 程序(安装在 GIT_EXEC_PATH 中)的 git <command> 时,将调用用户在 $PATH 的某个目录中可运行的 git-<command>。在命令名称后面传递的参数将原样传递给该程序。为了执行 git <foo>git 会寻找命令 <foo>(在 GIT_EXEC_PATH 中找到的核心 Git 程序,或者在 PATH 目录中的自定义程序),然后再尝试将 foo 作为别名。

Git 仓库

这些环境变量适用于所有核心 Git 命令。注意:值得注意的是,它们可能会被构建在 Git 之上的其他版本控制系统(SCM)使用或覆盖,因此如果使用外部前端,请多加注意。

GIT_INDEX_FILE

此环境变量指定一个备用的索引文件。如果未指定,将使用默认的 $GIT_DIR/index

GIT_INDEX_VERSION

此环境变量指定在写出索引文件时使用哪个索引版本。它不会影响现有的索引文件。默认情况下,使用索引文件版本 2 或 3。有关更多信息,请参见 git-update-index[1]

GIT_OBJECT_DIRECTORY

如果通过此环境变量指定了对象存储目录,则会在其下方创建 sha1 目录,否则将使用默认的 $GIT_DIR/objects 目录。

GIT_ALTERNATE_OBJECT_DIRECTORIES

由于 Git 对象不可变的特性,旧对象可以归档到共享的只读目录中。此变量指定一个由冒号 ":"(Windows 上为分号 ";")分隔的 Git 对象目录列表,这些目录可用于搜索 Git 对象。新对象不会写入这些目录。

以双引号 " 开头的条目将被解释为 C 语言风格的带引号路径,去除首尾的双引号并遵守反斜杠转义。例如,值 "path-with-\"-and-:-in-it":vanilla-path 包含两个路径:path-with-"-and-:-in-itvanilla-path

GIT_DIR

如果设置了 GIT_DIR 环境变量,它将指定一个路径,以代替默认的 .git 作为仓库的基础目录。命令行选项 --git-dir 也会设置此值。

GIT_WORK_TREE

设置工作区根目录的路径。这也可以通过 --work-tree 命令行选项和 core.worktree 配置变量来控制。

GIT_NAMESPACE

设置 Git 命名空间;详见 gitnamespaces[7]。命令行选项 --namespace 也会设置此值。

GIT_CEILING_DIRECTORIES

这应该是一个由冒号分隔的绝对路径列表。如果设置了此变量,其中的目录将作为 Git 在寻找仓库目录时不能向上进行 chdir 的边界(对于排除加载缓慢的网络目录很有用)。它不会排除当前工作目录、或在命令行及环境中设置的 GIT_DIR。通常,Git 必须读取此列表中的条目并解析其中可能存在的任何符号链接,以便与当前目录进行比较。但是,如果连这种访问都很慢,您可以在列表中添加一个空条目,以告诉 Git 后续条目不是符号链接,不需要解析;例如,GIT_CEILING_DIRECTORIES=/maybe/symlink::/very/slow/non/symlink

GIT_DISCOVERY_ACROSS_FILESYSTEM

当在没有 \".git\" 仓库目录的目录中运行时,Git 会尝试在父目录中寻找这样一个目录以找到工作区的顶层,但默认情况下它不会跨越文件系统边界。可以将这个布尔环境变量设置为 true,以告诉 Git 不要停在文件系统边界。与 GIT_CEILING_DIRECTORIES 一样,这不会影响通过 GIT_DIR 或在命令行中显式设置的仓库目录。

GIT_COMMON_DIR

如果该变量设置为某个路径,通常在 $GIT_DIR 中的非工作区专属文件将从该路径获取。特定于工作区的文件(如 HEAD 或 index)仍从 $GIT_DIR 获取。详见 gitrepository-layout[5]git-worktree[1]。该变量的优先级低于其他路径变量,如 GIT_INDEX_FILE、GIT_OBJECT_DIRECTORY…​

GIT_DEFAULT_HASH

如果设置了该变量,新仓库的默认哈希算法将被设置为此值。克隆时会忽略该值,并且始终使用远程仓库的设置。默认值为 "sha1"。参见 git-init[1] 中的 --object-format

GIT_DEFAULT_REF_FORMAT

如果设置了该变量,新仓库的默认引用后端格式将被设置为此值。默认值为 "files"。参见 git-init[1] 中的 --ref-format

GIT_REFERENCE_BACKEND

指定要使用的引用后端及其 URI。更多详情请参见 git-config[1] 中的 extensions.refStorage 选项。使用时会覆盖配置变量。

Git 提交

GIT_AUTHOR_NAME

创建提交或标签对象或写入引用日志(reflog)时,在作者身份中使用的易读名称。覆盖 user.nameauthor.name 配置设置。

GIT_AUTHOR_EMAIL

创建提交或标签对象或写入引用日志(reflog)时,在作者身份中使用的电子邮件地址。覆盖 user.emailauthor.email 配置设置。

GIT_AUTHOR_DATE

创建提交或标签对象或写入引用日志(reflog)时,作者身份所使用的日期。有关有效格式,请参见 git-commit[1]

GIT_COMMITTER_NAME

创建提交或标签对象或写入引用日志(reflog)时,在提交者身份中使用的易读名称。覆盖 user.namecommitter.name 配置设置。

GIT_COMMITTER_EMAIL

创建提交或标签对象或写入引用日志时,作者身份中使用的电子邮件地址。覆盖 user.emailcommitter.email 配置设置。

GIT_COMMITTER_DATE

创建提交或标签对象或写入引用日志时,提交者身份所使用的日期。有关有效格式,请参见 git-commit[1]

EMAIL

在未设置其他相关环境变量或配置设置时,在作者和提交者身份中使用的电子邮件地址。

Git 差异

GIT_DIFF_OPTS

唯一有效的设置是 "--unified=??" 或 "-u??",用于设置创建统一 diff 时显示的上下文行数。这优先于 Git diff 命令行上传递的任何 "-U" 或 "--unified" 选项值。

GIT_EXTERNAL_DIFF

当设置了环境变量 GIT_EXTERNAL_DIFF 时,将调用由其指定的程序来生成 diff,而 Git 不会使用其内置的 diff 机制。对于添加、删除或修改的路径,调用 GIT_EXTERNAL_DIFF 时会传入 7 个参数

path old-file old-hex old-mode new-file new-hex new-mode

其中

<old|new>-file

是 GIT_EXTERNAL_DIFF 可以用来读取 <old|new> 内容的文件,

<old|new>-hex

是 40 位十六进制字符的 SHA-1 哈希值,

<old|new>-mode

是文件模式的八进制表示。

文件参数可以指向用户的工作区文件(例如 "git-diff-files" 中的 new-file)、/dev/null(例如添加新文件时的 old-file)或临时文件(例如索引中的 old-file)。GIT_EXTERNAL_DIFF 无需担心删除(unlink)临时文件——它会在 GIT_EXTERNAL_DIFF 退出时被删除。

对于未合并的路径,调用 GIT_EXTERNAL_DIFF 时会传入 1 个参数,即 <path>。

对于每次调用 GIT_EXTERNAL_DIFF 的路径,都会设置两个环境变量:GIT_DIFF_PATH_COUNTERGIT_DIFF_PATH_TOTAL

GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE

如果将此布尔环境变量设置为 true,则 GIT_EXTERNAL_DIFF 命令在认为输入文件相等时应返回退出码 0,在认为它们不同时应返回 1,类似于 diff(1)。如果设置为 false(默认值),则无论是否相等,该命令都应返回退出码 0。任何其他退出码都会导致 Git 报告致命错误。

GIT_DIFF_PATH_COUNTER

一个从 1 开始的计数器,每处理一个路径就加 1。

GIT_DIFF_PATH_TOTAL

路径的总数。

其他

GIT_MERGE_VERBOSITY

控制递归合并策略显示输出量的数字。会覆盖 merge.verbosity。参见 git-merge[1]

GIT_PAGER

此环境变量会覆盖 $PAGER。如果设置为空字符串或值 "cat",Git 将不会启动分页器。另请参见 git-config[1] 中的 core.pager 选项。

GIT_PROGRESS_DELAY

控制在显示可选进度指示器之前延迟多少秒的数字。默认为 1。

GIT_EDITOR

此环境变量会覆盖 $EDITOR$VISUAL。在交互模式下需要启动编辑器时,它会被多个 Git 命令使用。另请参见 git-var[1] 以及 git-config[1] 中的 core.editor 选项。

GIT_SEQUENCE_EDITOR

在编辑交互式变基的待办列表(todo list)时,此环境变量会覆盖配置的 Git 编辑器。另请参见 git-rebase[1]git-config[1] 中的 sequence.editor 选项。

GIT_SSH
GIT_SSH_COMMAND

如果设置了这两个环境变量中的任何一个,那么 git fetchgit push 在需要连接到远程系统时,将使用指定的命令而不是 ssh。传递给配置命令的命令行参数由 ssh 变体决定。有关详细信息,请参阅 git-config[1] 中的 ssh.variant 选项。

$GIT_SSH_COMMAND 优先于 $GIT_SSH,且由 shell 解释,这允许包含额外的参数。另一方面,$GIT_SSH 必须仅为程序的路径(如果需要额外参数,可以是一个包装器 shell 脚本)。

通常,通过您个人的 .ssh/config 文件来配置所需的任何选项会更容易。请参阅您的 ssh 文档以获取更多详细信息。

GIT_SSH_VARIANT

如果设置了此环境变量,它将覆盖 Git 的自动检测,无论 GIT_SSH/GIT_SSH_COMMAND/core.sshCommand 是指向 OpenSSH、plink 还是 tortoiseplink。此变量会覆盖起相同作用的配置设置 ssh.variant

GIT_SSL_NO_VERIFY

设置并将此环境变量导出为任何值,都会让 Git 在通过 HTTPS 进行 fetch 或 push 时不验证 SSL 证书。

GIT_ATTR_SOURCE

设置从中读取 gitattributes 的树对象(tree-ish)。

GIT_ASKPASS

如果设置了此环境变量,那么需要获取密码或密码短语(例如用于 HTTP 或 IMAP 身份验证)的 Git 命令将调用此程序,并使用合适的提示信息作为命令行参数,并从其标准输出中读取密码。另请参见 git-config[1] 中的 core.askPass 选项。

GIT_TERMINAL_PROMPT

如果将此布尔环境变量设置为 false,git 将不会在终端上进行提示(例如在请求 HTTP 身份验证时)。

GIT_CONFIG_GLOBAL
GIT_CONFIG_SYSTEM

从给定的文件中读取配置,而不是从全局或系统级配置文件中读取。如果设置了 GIT_CONFIG_SYSTEM,则不会读取在构建时定义的系统配置文件(通常是 /etc/gitconfig)。同样,如果设置了 GIT_CONFIG_GLOBAL,则既不会读取 $HOME/.gitconfig 也会不读取 $XDG_CONFIG_HOME/git/config。可以将其设置为 /dev/null 以跳过读取相应级别的配置文件。

GIT_CONFIG_NOSYSTEM

是否跳过从系统级 $(prefix)/etc/gitconfig 文件中读取设置。此布尔环境变量可与 $HOME$XDG_CONFIG_HOME 结合使用,为挑剔的脚本创建一个可预测的环境;或者您可以将其设置为 true,以便在等待拥有足够权限的人修复有问题的 /etc/gitconfig 文件时临时避免使用它。

GIT_FLUSH

如果此布尔环境变量设置为 true,则像 git blame(增量模式下)、git rev-listgit loggit check-attrgit check-ignore 这样的命令将在每条记录输出后强制刷新输出流。如果此变量设置为 false,则这些命令的输出将使用完全缓冲的 I/O。如果未设置此环境变量, Git 将根据标准输出是否被重定向到文件来选择缓冲刷新或面向记录的刷新。

GIT_TRACE

启用常规跟踪信息,例如别名展开、内置命令执行和外部命令执行。

如果此变量设置为 "1"、"2" 或 "true"(不区分大小写),跟踪信息将打印到标准错误(stderr)。

如果该变量设置为大于 2 且小于 10(不含)的整数值,Git 将把此值解释为已打开的文件描述符,并尝试将跟踪信息写入该文件描述符。

或者,如果该变量设置为绝对路径(以 / 字符开头),Git 将其解释为文件路径,并尝试将跟踪信息追加到该文件中。

取消设置该变量,或将其设置为空、"0" 或 "false"(不区分大小写)将禁用跟踪信息。

GIT_TRACE_FSMONITOR

启用文件系统监控扩展的跟踪信息。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_PACK_ACCESS

启用对所有包(pack)访问的跟踪信息。对于每次访问,都会记录包文件名和包中的偏移量。这对于排查一些与包相关的性能问题可能会有帮助。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_PACKET

启用传入或传出给定程序的所有数据包的跟踪信息。这有助于调试对象协商或其他协议问题。在以 "PACK" 开头的数据包处将关闭跟踪(但请参阅下面的 GIT_TRACE_PACKFILE)。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_PACKFILE

启用对给定程序发送或接收的包文件的跟踪。与其他跟踪输出不同,此跟踪是逐字记录的:没有头部信息,也没有对二进制数据进行转义。您几乎肯定会希望将其重定向到文件中(例如 GIT_TRACE_PACKFILE=/tmp/my.pack),而不是将其显示在终端上或与其他跟踪输出混合。

请注意,目前这仅在克隆和获取的客户端实现。

GIT_TRACE_PERFORMANCE

启用与性能相关的跟踪信息,例如每个 Git 命令的总执行时间。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_REFS

启用对引用数据库操作的跟踪信息。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_SETUP

启用在 Git 完成设置阶段后,打印 .git、工作区和当前工作目录的跟踪信息。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_SHALLOW

启用有助于调试浅层仓库获取/克隆的跟踪信息。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_CURL

启用对 Git 传输协议所有传入和传出数据(包括描述性信息)的完整 curl 跟踪转储。这类似于在命令行上执行 curl --trace-ascii。有关可用的跟踪输出选项,请参阅 GIT_TRACE

GIT_TRACE_CURL_NO_DATA

当启用 curl 跟踪时(参见上面的 GIT_TRACE_CURL),不转储数据(即仅转储信息行和头部)。

GIT_TRACE2

启用来自 "trace2" 库更详细的跟踪信息。GIT_TRACE2 的输出是便于人类阅读的简单文本格式。

如果此变量设置为 "1"、"2" 或 "true"(不区分大小写),跟踪信息将打印到标准错误(stderr)。

如果该变量设置为大于 2 且小于 10(不含)的整数值,Git 将把此值解释为已打开的文件描述符,并尝试将跟踪信息写入该文件描述符。

或者,如果该变量设置为绝对路径(以 / 字符开头),Git 将其解释为文件路径,并尝试将跟踪信息追加到该文件中。如果该路径已存在且是一个目录,则跟踪信息将写入该目录中的文件(每个进程一个),文件名根据 SID 的最后一个组件和可选计数器(以避免文件名冲突)命名。

此外,如果该变量设置为 af_unix:[<socket-type>:]<absolute-pathname>,Git 将尝试将该路径作为 Unix 域套接字打开。套接字类型可以是 streamdgram

取消设置该变量,或将其设置为空、"0" 或 "false"(不区分大小写)将禁用跟踪信息。

有关完整详细信息,请参阅 Trace2 文档

GIT_TRACE2_EVENT

此设置会写入适合机器解释的基于 JSON 的格式。有关可用的跟踪输出选项,请参阅 GIT_TRACE2,有关完整详细信息,请参阅 Trace2 文档

GIT_TRACE2_PERF

除了 GIT_TRACE2 中可用的基于文本的信息外,此设置还会写入基于列的格式,用于了解嵌套区域。有关可用的跟踪输出选项,请参阅 GIT_TRACE2,有关完整详细信息,请参阅 Trace2 文档

GIT_TRACE_REDACT

默认情况下,当激活跟踪时,Git 会脱敏 Cookie、"Authorization:" 头部、"Proxy-Authorization:" 头部以及包文件 URI 的值。将此布尔环境变量设置为 false 可防止进行此脱敏操作。

GIT_NO_REPLACE_OBJECTS

设置并将此环境变量导出,会告诉 Git 忽略替换引用,不替换 Git 对象。

GIT_LITERAL_PATHSPECS

将此布尔环境变量设置为 true,将使 Git 将所有路径规格(pathspecs)视为字面量,而不是通配符(glob)模式。例如,运行 GIT_LITERAL_PATHSPECS=1 git log -- *.c' 将搜索修改了路径为 *.c 的提交,而不是与通配符 *.c 匹配的任何路径。如果您正在向 Git 提供字面路径(例如,先前由 git ls-tree--raw 差异输出等提供给您的路径),您可能会需要此设置。

GIT_GLOB_PATHSPECS

将此布尔环境变量设置为 true 将导致 Git 将所有路径规格视为通配符模式(又称 "glob" 魔法)。

GIT_NOGLOB_PATHSPECS

将此布尔环境变量设置为 true 将导致 Git 将所有路径规格视为字面量(又称 "literal" 魔法)。

GIT_ICASE_PATHSPECS

将此布尔环境变量设置为 true 将导致 Git 将所有路径规格视为不区分大小写。

GIT_NO_LAZY_FETCH

将此布尔环境变量设置为 true,会告诉 Git 不要根据需要从 promisor 远程仓库中延迟获取缺失的对象。

GIT_REFLOG_ACTION

当引用被更新时,除了记录引用的新旧值之外,还会创建引用日志(reflog)条目来追踪引用更新的原因(通常是更新引用的高级命令的名称)。当脚本化的 Porcelain 命令被最终用户作为顶级命令调用时,可以使用 git-sh-setup 中的 set_reflog_action 辅助函数将其名称设置到此变量中,以便记录在引用日志的主体中。

GIT_REF_PARANOIA

如果将此布尔环境变量设置为 false,则在迭代引用列表时忽略损坏或命名不当的引用。通常 Git 会尝试包含任何此类引用,这可能会导致某些操作失败。这通常是首选的做法,因为对于潜在的破坏性操作(例如 git-prune[1]),最好是中止操作而不是忽略损坏的引用(从而认为它们指向的历史记录不值得保存)。默认值为 1(即对检测和中止所有操作保持警惕)。通常情况下您不需要将其设置为 0,但在尝试从损坏的仓库中拯救数据时,它可能会很有用。

GIT_COMMIT_GRAPH_PARANOIA

从提交图(commit-graph)加载提交对象时,Git 会在对象数据库中对该对象执行存在性检查。这样做是为了避免由于过期的提交图(其中包含指向已删除提交的引用)而引起的问题,但这会带来性能开销。

默认值为 "false",这将禁用上述行为。将其设置为 "true" 将启用存在性检查,这样即使牺牲一些性能,也绝不会从提交图中返回过期的提交。

GIT_ALLOW_PROTOCOL

如果将其设置为以冒号分隔的协议列表,则其行为表现为:protocol.allow 被设置为 never,且列出的每个协议的 protocol.<name>.allow 都被设置为 always(覆盖任何现有配置)。有关更多详细信息,请参阅 git-config[1] 中对 protocol.allow 的说明。

GIT_PROTOCOL_FROM_USER

将此布尔环境变量设置为 false,以禁用 fetch/push/clone 使用配置为 user 状态的协议。这对于限制来自不受信任仓库的递归子模块初始化,或者对于向 git 命令提供可能不受信任的 URL 的程序非常有用。有关更多详细信息,请参阅 git-config[1]

GIT_PROTOCOL

仅供内部使用。用于有线协议握手。包含一个以冒号 : 分隔的键列表,并带有可选值 <key>[=<value>]。必须忽略未知键和值的存在。

请注意,可能需要配置服务器以允许此变量在某些传输方式上传递。在访问本地仓库(即 file:// 或文件系统路径)以及通过 git:// 协议访问时,它会自动传播。对于 git-over-http,在大多数配置中它应该会自动工作,但请参阅 git-http-backend[1] 中的讨论。对于 git-over-ssh,可能需要配置 ssh 服务器以允许客户端传递此变量(例如,在 OpenSSH 中使用 AcceptEnv GIT_PROTOCOL)。

此配置是可选于的。如果该变量未传播,则客户端将退回到原始的 "v0" 协议(但可能会错失一些性能改进或功能)。此变量目前仅影响克隆和获取;它尚未用于推送(但未来可能会使用)。

GIT_OPTIONAL_LOCKS

如果将此布尔环境变量设置为 false,Git 将完成任何请求的操作,而不会执行任何需要加锁的可选子操作。例如,这将防止 git status 作为副作用去刷新索引。这对于在后台运行的进程非常有用,因为它们不希望与仓库上的其他操作产生锁冲突。默认值为 1

GIT_REDIRECT_STDIN
GIT_REDIRECT_STDOUT
GIT_REDIRECT_STDERR

仅限 Windows:允许将标准输入/输出/错误句柄重定向到由环境变量指定的路径。这在多线程应用程序中特别有用,因为在这些程序中,通过 CreateProcess() 传递标准句柄的规范方法不可行,因为它会要求句柄被标记为可继承的(从而导致每一个派生的进程都会继承它们,可能会阻塞正常的 Git 操作)。主要预期的使用场景是使用命名管道进行通信(例如 \\.\pipe\my-git-stdin-123)。

支持两个特殊值:off 将简单地关闭对应的标准句柄,如果 GIT_REDIRECT_STDERR2>&1,标准错误将被重定向到与标准输出相同的句柄。

GIT_PRINT_SHA1_ELLIPSIS (已弃用)

如果设置为 yes,则在(缩写的)SHA-1 值后打印省略号。这会影响分离头指针(detached HEAD)的指示(git-checkout[1])和原始 diff 输出(git-diff[1])。在上述情况下打印省略号已不再被认为是合适的,并且对它的支持(连同该变量一起)在可预见的未来可能会被移除。

GIT_ADVICE

如果设置为 0,则禁用所有建议信息。这些信息旨在为人类用户提供提示,帮助他们摆脱棘手的情况或利用新功能。用户可以使用 advice.* 配置键来禁用单个提示信息。这些信息可能会对执行 Git 进程的工具造成干扰,因此可以使用此变量来禁用这些信息。(也可以使用全局选项 --no-advice,但旧版本的 Git 在不理解此选项时可能会失败。不理解该环境变量的 Git 版本将忽略它。)

讨论

有关以下内容的更多详细信息,可参阅用户手册中的 Git 概念章节gitcore-tutorial[7]

一个 Git 项目通常由一个工作目录组成,其顶层有一个 ".git" 子目录。除其他内容外,.git 目录还包含:一个表示项目完整历史记录的压缩对象数据库;一个将该历史记录与工作区当前内容链接起来的 "index"(索引)文件;以及指向该历史记录的命名指针(如标签和分支头)。

对象数据库包含三种主要类型的对象:用于保存文件数据的数据对象(blobs);用于指向数据对象和其他树对象以构建目录层级的树对象(trees);以及每个都引用单个树对象和若干父提交的提交对象(commits)。

提交对象(相当于其他系统中所说的 "变更集" 或 "版本")代表项目历史中的一个步骤,而每个父提交代表紧接其前的一步。拥有多个父提交的提交代表独立开发线路的合并。

所有对象都通过其内容的 SHA-1 哈希值来命名,通常写成一个 40 位的十六进制数字符串。这些名称是全局唯一的。只需签署该提交,即可保证导致该提交的整个历史记录的真实性。为此目的提供了第四种对象类型——标签对象(tag)。

在首次创建时,对象存储在单独的文件中,但为了提高效率,稍后它们可能会被压缩到 "包文件"(pack files)中。

被称为引用(refs)的命名指针标记了历史中令人感兴趣的时间点。引用可以包含对象的 SHA-1 名称,也可以包含另一个引用的名称(后者被称为 "符号引用")。名称以 refs/head/ 开头的引用包含正在开发的分支的最新提交(或 "head")的 SHA-1 名称。感兴趣的标签的 SHA-1 名称存储在 refs/tags/ 下。名为 HEAD 的符号引用包含当前检出的分支的名称。

索引文件由所有路径的列表初始化,并且对于每个路径,包含一个数据对象(blob)和一组属性。该数据对象代表当前分支头部的文件内容。属性(最后修改时间、大小等)取自工作树中相应的文件。随后对工作树的修改可以通过比较这些属性来发现。索引可以用新内容进行更新,并且可以从索引中存储的内容创建新的提交。

索引还能够为给定的路径名存储多个条目(称为 "阶段",即 "stages")。在合并进行中时,这些阶段用于保存文件的各种未合并版本。

安全性

某些配置选项和钩子(hook)文件可能会导致 Git 运行任意的 shell 命令。因为使用 git clone 时不会复制配置和钩子,所以克隆含有不受信任内容的远程仓库、使用 git log 检查它们等操作通常是安全的。

但是,当 .git 目录本身来自不受信任的来源时,在该 .git 目录(或其周围的工作树)中运行 Git 命令是不安全的。其配置和钩子中的命令会照常执行。

默认情况下,当仓库的所有者不是运行该命令的用户时,Git 将拒绝运行。请参阅 git-config[1] 中关于 safe.directory 的条目。虽然这可以帮助在多用户环境中保护您,但请注意,您也可能获取到归您所有但不受信任的仓库(例如,如果您从不受信任的来源解压 zip 文件或 tar 包)。在这种情况下,您需要先 "净化"(sanitize)该不受信任的仓库。

如果您有一个不受信任的 .git 目录,您应该首先使用 git clone --no-local 克隆它以获取一个干净的副本。Git 确实限制了由 upload-pack(处理克隆或获取的服务器端)运行的选项和钩子的集合,但请注意,针对 upload-pack 的攻击面很大,因此这确实带有一定的风险。最安全的方法是以无特权用户的身份提供该仓库(无论是通过 git-daemon[1]、ssh,还是使用其他工具更改用户 ID)。请参阅 git-upload-pack[1]SECURITY 部分中的讨论。

更多文档

要开始使用 Git,请参阅 "description" 部分中的参考资料。以下内容对于初次使用的用户来说可能过于详细了。

用户手册中的 Git 概念章节gitcore-tutorial[7] 都提供了对 Git 底层架构的介绍。

有关推荐工作流程的概述,请参阅 gitworkflows[7]

另请参见 howto 文档,其中有一些有用的示例。

内部机制记录在 Git API 文档中。

从 CVS 迁移的用户可能还想阅读 gitcvs-migration[7]

作者

Git 由 Linus Torvalds 创立,目前由 Junio C Hamano 维护。Git 邮件列表 <git@vger.kernel.org> 提供了大量的贡献。https://openhub.net/p/git/contributors/summary 为您提供了一个更完整的贡献者列表。

如果您克隆了 git.git 本身,git-shortlog[1]git-blame[1] 的输出可以显示该项目特定部分的作者。

报告 Bug

请向 Git 邮件列表 <git@vger.kernel.org> 报告 Bug,那里的开发和维护最为活跃。您无需订阅该列表即可向其发送消息。请参阅位于 https://lore.kernel.org/git 的列表存档,以获取以前的 Bug 报告和其他讨论。

与安全相关的问题应私下透露给 Git 安全邮件列表 <git-security@googlegroups.com>。

GIT

Git[1] 套件的一部分