Git 中文参考(一)(2)https://developer.aliyun.com/article/1565871
讨论
有关以下内容的更多详细信息,请参见用户手册和 gitcore-tutorial [7] 的 Git 概念章节。
Git 项目通常包含一个工作目录,顶层有一个“.git”子目录。 .git 目录包含一个表示项目完整历史记录的压缩对象数据库,一个将该历史记录链接到工作树的当前内容的“索引”文件,以及指向该历史记录的指针,如标记和分公司负责人
对象数据库包含三种主要类型的对象:blob,用于保存文件数据;树,指向 blob 和其他树来构建目录层次结构;和提交,每个引用一个树和一些父提交。
相当于其他系统称为“变更集”或“版本”的提交代表项目历史中的一个步骤,每个父项代表紧接在前的步骤。具有多个父项的提交代表独立开发线的合并。
所有对象都由其内容的 SHA-1 哈希命名,通常写为 40 个十六进制数字的字符串。这些名称是全球唯一的。通过签署该提交,可以保证导致提交的整个历史记录。为此目的提供第四对象类型,标签。
首次创建时,对象存储在单个文件中,但为了提高效率,以后可以将它们一起压缩为“包文件”。
名为 refs 的命名指针标记历史中的有趣点。 ref 可以包含对象的 SHA-1 名称或另一个 ref 的名称。名称以ref/head/开头的引用包含正在开发的分支的最新提交(或“头部”)的 SHA-1 名称。感兴趣的标签的 SHA-1 名称存储在ref/tags/下。名为HEAD的特殊引用包含当前签出分支的名称。
索引文件使用所有路径的列表进行初始化,并为每个路径初始化 blob 对象和一组属性。 blob 对象表示当前分支头部的文件内容。属性(上次修改时间,大小等)取自工作树中的相应文件。通过比较这些属性可以找到对工作树的后续更改。可以用新内容更新索引,并且可以从存储在索引中的内容创建新提交。
索引还能够存储给定路径名的多个条目(称为“阶段”)。这些阶段用于在合并进行时保存文件的各种未合并版本。
进一步的文件
请参阅“说明”部分中的参考资料以开始使用 Git。以下可能是首次使用者所需的详细信息。
用户手册和 gitcore-tutorial [7] 的 Git 概念章节都提供了对底层 Git 架构的介绍。
有关推荐工作流程的概述,请参见 gitworkflows [7] 。
有关一些有用的示例,另请参见 howto 文档。
内部结构记录在 Git API 文档中。
从 CVS 迁移的用户可能还想阅读 gitcvs-migration [7] 。
作者
Git 由 Linus Torvalds 创办,目前由 Junio C Hamano 维护。许多贡献来自 Git 邮件列表< git@vger.kernel.org >。 www.openhub.net/p/git/contributors/summary 为您提供了更完整的贡献者列表。
如果你自己克隆了 git.git,那么 git-shortlog [1] 和 git-blame [1] 的输出可以向你展示项目特定部分的作者。
报告错误
将错误报告给 Git 邮件列表< git@vger.kernel.org >主要完成开发和维护的地方。您无需订阅列表即可在其中发送消息。有关以前的错误报告和其他讨论,请参阅 public-inbox.org/git 的列表存档。
与安全相关的问题应私下披露给 Git Security 邮件列表< git-security@googlegroups.com >。
也可以看看
gittutorial [7] , gittutorial-2 [7] , giteveryday [7] , gitcvs-migration [7] , gitglossary [7] , gitcore-tutorial [7] , gitcli [7] , Git 用户手册, gitworkflows [7 ]
GIT
部分 git [1] 套件
git-config
原文:
git-scm.com/docs/git-config贡献者:honglyua
名称
git-config - 获取并设置存储库或全局选项
概要
git config [<file-option>] [--type=<type>] [--show-origin] [-z|--null] name [value [value_regex]] git config [<file-option>] [--type=<type>] --add name value git config [<file-option>] [--type=<type>] --replace-all name value [value_regex] git config [<file-option>] [--type=<type>] [--show-origin] [-z|--null] --get name [value_regex] git config [<file-option>] [--type=<type>] [--show-origin] [-z|--null] --get-all name [value_regex] git config [<file-option>] [--type=<type>] [--show-origin] [-z|--null] [--name-only] --get-regexp name_regex [value_regex] git config [<file-option>] [--type=<type>] [-z|--null] --get-urlmatch name URL git config [<file-option>] --unset name [value_regex] git config [<file-option>] --unset-all name [value_regex] git config [<file-option>] --rename-section old_name new_name git config [<file-option>] --remove-section name git config [<file-option>] [--show-origin] [-z|--null] [--name-only] -l | --list git config [<file-option>] --get-color name [default] git config [<file-option>] --get-colorbool name [stdout-is-tty] git config [<file-option>] -e | --edit
描述
您可以使用此命令查询/设置/替换/取消设置选项。该名称实际上是由一个点分隔的配置项名和键名组成,即name 相当于.,执行git config .后,该配置项设置的值将被输出。
可以使用--add为某个配置项添加多个值。如果要更新或取消某个配置项,而这个配置项存在多个值时,你需要给出值后缀的正则表达式value_regex。它只更新或取消与正则表达式匹配的设置值。如果你想处理那些与正则表达式不匹配的设置行,只需在前面添加一个感叹号(另见示例)。
--type=选项是为了保证以给定的 type 去规范化输入和输出 git config 中配置项的值。如果没有给出--type=,则不执行规范化。调用者可以使用--no-type取消设置里已有的--type说明符。
读取时,默认情况下会从系统,全局和存储库本地配置文件中读取值,并且可以使用选项--system,--global,--local,--worktree和--file 来告诉命令读取哪里的配置文件(参见 FILES )。
写入时,默认情况下会将新值写入存储库本地配置文件,并且可以使用选项--system,--global,--worktree,--file 来告诉命令写入该位置(可以使用--local但这是默认选项)。
出错时,此命令将失败,并以非零状态码退出。一些退出状态码有:
- 部分或键无效(ret = 1),
- 没有提供配置选项或名称(ret = 2),
- 配置文件无效(ret = 3),
- 配置文件无法写入(ret = 4),
- 你试图取消一个不存在的选项(ret = 5),
- 您在尝试取消设置/设置配置选项时,该配置项拥有多行配置(ret = 5),或
- 您在尝试使用无效的正则表达式(ret = 6)。
成功时,该命令返回退出状态码 0。
选项
--replace-all
默认行为是最多替换一行。它将会替换与键匹配的所有行(以及有可选的 value_regex)。
--add
在不更改任何现有值的情况下向选项添加新行。这与在--replace-all中以 ^ $ 作为 value_regex 的值相同。
--get
获取给定键的值(可选择通过与值匹配的正则表达式进行过滤)。如果未找到对应键值,则返回错误状态码 1;如果找到多个键值对,则返回最后一个值。
--get-all
与 get 类似,但返回所有键值对的值。
--get-regexp
与–get-all 类似,输出所有与正则表达式匹配的键值对,并输出键名和对应值。正则表达式匹配目前区分大小写,并且针对键的规范化版本完成,其中段和变量名称是小写的,但子段名称不是。
--get-urlmatch name URL
如果给出了一个由两部分组成的配置项名称 section.key,则返回与最匹配的值(如果不存在此配置名,则 section.key 的值用作回退)。如果仅将输入 section,则返回所有与 section 匹配的键值对。如果未找到值,则返回错误代码 1。
--global
对于写入选项:写入全局配置文件~/.gitconfig,而不是存储库配置文件.git/config。如果全局配置文件不存在而$XDG_CONFIG_HOME/git/config文件存在,则写入$XDG_CONFIG_HOME/git/config文件。
对于读取选项:只读取~/.gitconfig和$XDG_CONFIG_HOME/git/config文件中的配置,而不是所有可用文件中的。
另见 FILES 。
--system
对于写入选项:写入系统路径下的配置文件$(prefix)/etc/gitconfig,而不是存储库配置文件.git/config。
对于读取选项:只读取系统路径下的配置文件$(prefix)/etc/gitconfig中的配置,而不是所有可用文件中的。
另见 FILES 。
--local
对于写入选项:写入存储库配置文件.git/config中。这是默认行为。
对于读取选项:只读取存储库配置文件.git/config中的配置,而不是所有可用文件中的。
另见 FILES 。
--worktree
与--local类似,但如果extensions.worktreeConfig存在,则读取或写入.git/config.worktree中。如果不存在,它与--local效果相同。
-f config-file
--file config-file
使用给定的配置文件,而不是 GIT_CONFIG 指定的配置文件。
--blob blob
与--file类似,但给定是 blob 路径而不是文件路径。例如。您可以使用 master:.gitmodules,从 master 分支中的文件.gitmodules中读取配置值。有关拼写 blob 名称的更完整列表,请参阅 gitrevisions [7] 中的“指定修订”部分。
--remove-section
从配置文件中删除给定的配置项。
--rename-section
将给定 section 重命名为新名称。
--unset
从配置文件中删除与键匹配的行。
--unset-all
从配置文件中删除与键匹配的所有行。
-l
--list
列出配置文件中设置的所有配置项及其值。
--type <type>
git config 在给定的类型约束下,将确保任何输入或输出有效,并将以的规范形式规范化输出值。
有效包括:
- bool :将值规范化为“true”或“false”。
- int :将值规范化为简单的十进制数。 k,m 或 g 的可选后缀将使该值在输入时乘以 1024,1048576 或 1073741824。
- bool-or-int :根据 bool 或 int 进行标准化,如上所述。
- path :通过以规范化的形式,在值前添加前缀
~来指向用户的根目录$HOME和~user。设置值时,此说明符无效(但您可以使用命令行中的git config section.variable ~/让 shell 执行扩展。) - expiry-date:通过以规范化的形式,将固定或相对固定的日期字符串转换为时间戳。设置值时,此说明符无效。
- color :获取值时,通过转换为 ANSI 颜色转义序列进行规范化。设置值时,将执行完整性检查以确保给定值可以作为 ANSI 颜色进行规范化,但它按原样编写。
--bool
--int
--bool-or-int
--path
--expiry-date
选择类型说明符的历史选项。而不是--type(见上文)。
--no-type
取消设置先前设置的类型说明符(如果先前已设置)。此选项请求 git config 不规范化检索到的变量。没有--type=或--,--no-type也不会受影响。
-z
--null
对于输出值或键名时,始终使用空字符(而不是换行符)作为结束字符串。使用换行符作为键和值之间的分隔符。这允许准确地解析输出而不会混淆,例如包含换行符的值。
--name-only
仅输出--list或--get-regexp的配置变量名称。
--show-origin
增加输出内容:origin 的类型(文件,标准输入,blob,命令行)和 origin 的指向(配置文件路径,ref 或 blob id,如果适用)
--get-colorbool name [stdout-is-tty]
找到name的颜色设置(例如color.diff)并输出“true”或“false”。 stdout-is-tty可以为“true”或“false”,并在配置显示为“auto”时予以考虑。如果缺少stdout-is-tty,则检查命令本身的标准输出,如果要使用颜色则退出状态 0,否则退出状态 1。当name的颜色未设置时,该命令使用color.ui作为后备。
--get-color name [default]
找到为name配置的颜色(例如color.diff.new)并将其作为 ANSI 颜色转义序列输出到标准输出。如果没有name未配置颜色,则会使用可选的default参数。
--type=color [--default=]优于--get-color。
-e
--edit
打开编辑器,修改指定的配置文件; --system,--global或存储库(默认)。
--[no-]includes
在配置文件中查找值时,会考虑使用include.*指令。如果给出特定文件(例如,使用--file,--global等),则功能默认是off。如果在搜索所有配置文件时,功能是on
--default <value>
使用--get时,找不到请求的变量时,其行为就像是赋给该变量的值。
配置
当使用--list或可能有多个返回结果的--get-*时,会遵守pager.config列出配置。默认是使用分页的。
文件
如果未使用--file选项,则git config会从以下四个配置文件中,搜索配置选项:
$(prefix)/etc/gitconfig
系统范围的配置文件。
$XDG_CONFIG_HOME/git/config
特定用户的第二个配置文件。如果$XDG_CONFIG_HOME未设置或为空,将使用$HOME/.config/git/config。此文件中设置的任何单值变量都将被~/.gitconfig中的任何内容覆盖。如果您有时使用旧版本的 Git,最好不要创建此文件,因为最近添加了对此文件的支持。
~/.gitconfig
特定用户的配置文件。也称为“全局”配置文件。
$GIT_DIR/config
特定存储库的配置文件。
$GIT_DIR/config.worktree
这是可选的,仅在$GIT_DIR/config中存在extensions.worktreeConfig时才会被搜索到。
如果没有给出进一步的选项,在读取所有配置选项时,将从以上所有可用的文件中读取。如果全局或系统范围的配置文件不可用,则它们将会被忽略。如果存储库配置文件不可用或不可读,git config将以非零错误状态退出。但是,在任何情况下都不会发出错误消息。
按上面给出的顺序读取配置文件中的配置,新读到的配置值将会覆盖之前读到的。当获取多个值时,将使用来自所有文件的键的所有值。
使用-c选项运行任何 git 命令时,可以覆盖单个配置参数。有关详细信息,请参阅 git[1]。
所有配置选项写入时,都将默认写入到当前存储库的配置文件中。请注意,这也会影响--replace-all和--unset等选项。 git config 一次只能更改一个配置文件中配置。
您可以通过命令行选项或环境变量覆盖这些规则。 --global,--system和--worktree选项将分别限制用于全局,系统范围和每个工作树的配置文件。 GIT_CONFIG环境变量具有类似的效果,但您可以指定所需的任何文件名。
环境变量
GIT_CONFIG
从给定文件而不是.git/config 中获取配置。使用“–global”选项将强制使用~/.gitconfig。使用“–system”选项强制使用$(前缀)/etc/gitconfig。
GIT_CONFIG_NOSYSTEM
是否跳过从系统配置文件$(前缀)/etc/gitconfig 中读取设置。有关详细信息,请参阅git[1]。
另见 FILES。
例子
给出像这样的.git / config:
# # 给出像这样的, # '#' 或者 ';' 是表示注释 #
; core variables [core] ; Don't trust file modes filemode = false
; Our diff algorithm [diff] external = /usr/local/bin/diff-wrapper renames = true
; Proxy settings [core] gitproxy=proxy-command for kernel.org gitproxy=default-proxy ; for all the rest
; HTTP [http] sslVerify [http "https://weak.example.com"] sslVerify = false cookieFile = /tmp/cookie.txt
你可以将 filemode 设置为 true
% git config core.filemode true
假设的代理命令条目实际上有一个后缀来识别它们适用的 URL。以下是如何将 kernel.org 的条目更改为“ssh”。
% git config core.gitproxy '"ssh" for kernel.org' 'for kernel.org$'
这确保仅替换 kernel.org 的键/值对。
要删除 diff 的重命名配置,请执行
% git config --unset diff.renames
如果要删除多个配置值中的其中一个配置(如上面的 core.gitproxy),则必须提供与该配置值匹配的正则表达式。
要查询给定键的值,请执行
% git config --get core.filemode
要么
% git config core.filemode
或者,查询多配置值中的某个配置值:
% git config --get core.gitproxy "for kernel.org$"
如果您想知道多配置值的所有值,请执行以下操作:
% git config --get-all core.gitproxy
如果你想冒点险,你可以用新的值取代所有的 core.gitproxy
% git config --replace-all core.gitproxy ssh
但是,如果您真的只想替换默认代理的行配置,即没有“for …”后缀的行,请执行以下操作:
% git config core.gitproxy ssh '! for '
要实际只匹配带有感叹号的值,您必须这样做
% git config section.key value '[!]'
要添加新代理,而不更改任何现有代理,请使用
% git config --add core.gitproxy '"proxy-command" for example.com'
在脚本中使用配置中的自定义颜色的示例:
#!/bin/sh WS=$(git config --get-color color.diff.whitespace "blue reverse") RESET=$(git config --get-color "" "reset") echo "${WS}your whitespace color or blue reverse${RESET}"
对于https://weak.example.com的 URL,http.sslVerify设置为 false,而其他所有 URL 设置为true:
% git config --type=bool --get-urlmatch http.sslverify https://good.example.com true % git config --type=bool --get-urlmatch http.sslverify https://weak.example.com false % git config --get-urlmatch http https://weak.example.com http.cookieFile /tmp/cookie.txt http.sslverify false
配置文件
Git 配置文件包含许多影响 Git 命令行为的变量。每个存储库中的文件.git/config和可选config.worktree(参见下面的extensions.worktreeConfig)用于存储该存储库的配置,$HOME/.gitconfig用于存储每用户配置,会回退.git/config文件中的配置。文件/etc/gitconfig可用于存储系统范围的默认配置。
配置变量由 Git 管道和瓷器使用。变量拆分为 sections,其中变量名称是最后一个点分隔的后面段,而 section 名称是最后一个点之前的所有内容。变量名称不区分大小写,仅允许使用字母数字字符和-,并且必须以字母字符开头。一些变量可能会出现多次;我们说那个变量是多值的。
句法
语法相当灵活和宽容;空白大多被忽略了。# 号和 ; 分号表示该字符开始到行尾都是注释,空行被忽略。
配置文件由 sections 和变量组成。一个 section 以方括号中的 section 名称开头,并一直持续到下一 section 开始。section 名称不区分大小写。只允许使用字母数字字符、-和.。每个变量必须属于某个 section,这意味着在第一次设置变量之前必须有一个 section。
section 可以进一步划分为小的 section。要开始小的 section,请将其名称放在双引号中,并用空格与 section 隔开,如下例所示:
[section "subsection"]
子节名称区分大小写,可以包含除换行符和空字节之外的任何字符。可以通过\"和\\转义,包含双引号和反斜杠。读取时会删除其他字符前面的反斜杠;例如,\t读取为t,\0读取为0,section 不能跨越多行。变量可以直接属于某个 section 或给定的子 section。你可以有[section],但是可以不必有[section "subsection"]。
还有一个不推荐使用的[section.subsection]语法。使用此语法,子 section 名称将转换为小写,并且还区分大小写。这些子 section 名称遵循与 section 名称相同的限制。
所有其他行(以及节标题后面的行的其余部分)被识别为设置变量,形式为 name = value(或者只是name,通过一个短划线用来说明变量是布尔值“true”)。变量名称不区分大小写,仅允许使用字母、数字字符和-,并且必须以字母开头。
定义值的行可以通过以\结束来继续到下一行;反引号和行尾被剥离。name = 之后的空格,第一个注释字符#或;之后的行的剩余部分,和该行尾部的空格都会被被丢弃,除非它们用双引号括起来。值中的内部空格逐字保留。
在双引号内,使用双引号"和反斜杠\字符必须转义:对"使用\",而对\使用\\。
识别以下转义序列(在\"和\\旁边):换行符(NL)的\n,水平制表的\t(HT,TAB)和退格(BS)的\b。其他 char 转义序列(包括八进制转义序列)无效。
包括
include和includeIf部分允许您包含来自其他来源的配置指令。这些 section 的行为相同,但includeIf的 section 如果其条件未评估为真则可以忽略;请参阅下面的“条件包含”。
您可以通过设置include.path(或includeIf.*.path)的值为另一个配置文件的文件名,来包含这个配置文件的配置。该变量将路径名作为其值,并受波形扩展的影响。这些变量可以多次给出。
文件的内容会被立刻载入配,就好像它们已在 include 伪指令的位置找到一样。如果变量的值是相对路径,则该路径被认为是相对于包含 include 伪指令的配置文件路径。请参阅下面的示例。
有条件的包括
您可以通过将includeIf..path变量设置为要包含的文件的名称来有条件地包含另一个配置文件。
条件以关键字后跟冒号开头,一些数据的格式和含义取决于关键字。支持的关键字是:
gitdir
关键字gitdir:后面的数据用作 glob 模式。如果.git 目录的位置与模式匹配,则满足包含条件。
.git 位置可以自动发现,也可以来自$GIT_DIR环境变量。如果通过.git 文件(例如,从子模块或链接的工作树)自动发现存储库,则.git 位置将是.git 目录所在的最终位置,而不是.git 文件所在的位置。
该模式可以包含标准的通配符和另外两个可以匹配多个路径组件的**/和/**。有关详细信息,请参阅 gitignore[5] 。为了方便:
- 如果模式以
~/开头,则~将替换为环境变量HOME的内容。 - 如果模式以
./开头,则将其替换为包含当前配置文件的目录。 - 如果模式不以
~/,./或/开始,则**/将自动添加前置。例如,模式foo/bar变为**/foo/bar并与/any/path/to/foo/bar匹配。 - 如果模式以
/结束,则会自动添加**。例如,模式foo/变为foo/**。换句话说,它以递归方式匹配“foo”和内部的所有内容。
gitdir/i
这与gitdir相同,只是匹配是不区分大小写的(例如,在不区分大小写的文件系统上)
关于通过gitdir和gitdir/i进行匹配的更多注意事项:
$GIT_DIR中的符号链接在匹配之前未解析。- 符号链接和路径的 realpath 版本将在
$GIT_DIR之外匹配。例如,如果~/git是/mnt/storage/git的符号链接,那么gitdir:~/git和gitdir:/mnt/storage/git都会匹配。
在 v2.13.0 中此功能的初始版本中并非如此,该版本仅匹配 realpath 版本。想要与此功能的初始版本兼容的配置需要仅指定 realpath 版本或两个版本。 - 请注意,“…/”并不特殊,并且会按字面意思匹配,这不太可能是您想要的。
Git 中文参考(一)(4)https://developer.aliyun.com/article/1565873