8.1 配置Git
如前所述,使用git config可配置Git,首先需设定用户名和用户邮箱,
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Git使用了一组配置文件,用于修改Git系统的默认功能,Git首先将查找,系统级配置文件/etc/gitconfig,操作系统的所有用户和所有仓库,都将使用该文件的配置,同时用户可使用git config --system,修改系统级配置。
之后Git将查找,用户级配置文件~/.gitconfig(或~/.config/git/config),这是特定用户所使用的配置文件,同时它可覆盖系统级的同名配置,用户可使用git config --global,修改用户级配置。
然后Git还可查找,仓库级配置文件.git/config,这是特定仓库所使用的配置文件,同时它可覆盖系统级和用户级的同名配置,用户可使用git config --local,修改仓库级配置,不建议用户修改该配置,使用默认配置即可。
注意,Git配置文件是一个纯文本,用户可以选择手工修改,或是使用git config命令。
客户端的基本配置
Git的配置分为两大类,客户端和服务端,客户端配置即用户配置,虽然大多数功能都支持用户配置,但依然有很多琐碎的小功能,只适用于特殊场景,这里只讨论常用功能,如果需要查看所有的配置变量,可运行,
$ man git-config
core.editor
默认情况下,Git将使用,shell环境变量VISUAL或EDITOR所指定的默认文本编辑器,通常是vi编辑器,文本编辑器可用于修改提交和标签的描述,使用core.editor配置变量,用户可设定不同的文本编辑器,比如emacs,
$ git config --global core.editor emacs
commit.template
该配置变量可设定成,一个带路径的文件,当编写提交描述时,该文件可为用户提供一个预置模板,以保证正确的格式,比如常见的模块文件 ~/.gitmessage.txt,
Subject line (try to keep under 50 characters)
Multi-line description of commit,
feel free to be detailed.
[Ticket: X]
Subject line是提交者应当给出的提交简介,即git log --oneline的输出信息,之后两行,则需详细描述提交的细节,Ticket则是问题点或bug的编号。
完成commit.template设定后,用户再运行git commit,Git将调用文本编辑器,并打开提交描述模板,等待用户编辑,
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
当然不同的开发团队可以自定义不同的提交模板。
core.pager
该配置变量可设定Git输出的分页格式(分页器),比如log或diff命令中,默认参数为less,也可设定为more,当然用户也可提供一个空串,失效该配置,这时输出将不会使用分页模式,
$ git config --global core.pager ''
user.signingkey
在创建附注标签的签名时,预设一个GPG签名密钥,可简化操作,如下,
$ git config --global user.signingkey <GPG密钥id>
配置变量被设定后,在创建标签时,则无需指定一个密钥,
$ git tag -s <tag-name>
core.excludesfile
该配置变量可指定.gitignore文件,.gitignore中列出的文件,可视为未跟踪文件,或是在运行git add命令时,不暂存这些文件,比如用户创建了一个~/.gitignore_global文件,内容如下,
*~
.*.swp
.DS_Store
之后,可设定配置,
git config --global core.excludesfile ~/.gitignore_global
help.autocorrect
如果用户输入出现错误,如下,
$ git chekcout master
git: 'chekcout' is not a git command. See 'git --help'.
Did you mean this?
checkout
Git有能力识别用户的输入错误,只是默认被禁用,如果将help.autocorrect设为1,Git可自动修正用户的输入错误,如下,
$ git chekcout master
WARNING: You called a Git command named 'chekcout', which does not exist.
Continuing under the assumption that you meant 'checkout'
in 0.1 seconds automatically...
0.1秒是等待时间,如果用户的设定值为50,那么等待时间为5秒,即Git自动修正用户的输入错误后,将等待一段时间,以便用户确认修正后的结果,如果用户未给出响应,修正后的命令,将自动执行。
配色
Git支持命令行输出的配色,可协助用户更快更简单地查看相关命令的输出,因此提供了一些配置变量,方便设定不同的配色方案。
color.ui
Git会默认实现命令输出的配色,同时也提供了一个配置变量,用于关闭输出的配色,
$ git config --global color.ui false
配色的默认参数为auto,但只能用于命令行输出,如果输出信息重定向到管道或文件中,配色将失效,当然用户可将配色参数,设定为always,管道输出也将包含配色信息,在大多数情况下,为了在重定向输出中,保留配色信息,可在Git命令中,添加 --color选项,因此默认参数auto,基本能满足用户的大多数需求。
color.*
如果用户期望不同命令使用不同的配色,Git也支持相关设定,每个配置变量都可使用true,false,always参数值,
color.branch
color.diff
color.interactive
color.status
同时每个配置变量还包含了子变量,用于设定更复杂的局部配色效果,以下命令将设定,diff输出的meta信息,前景色为蓝色,背景色为黑色,文字加粗,
$ git config --global color.diff.meta "blue black bold"
用户还可使用不同的颜色值,normal/black/red/green/yellow/blue/magenta/cyan/white,同时也可设置不同的文字风格,bold/dim/ul/blink/reverse。
合并和比较的外部工具
虽然Git自建了比较(diff)工具,但可以替换成外部工具,同时也可设定一个合并工具(包含图形界面),方便用户手动处理合并冲突,这个工具即为Perforce Visual Merge Tool(P4Merge),另外P4Merge支持主流平台,macOS/Linux/Windows,首先下载P4Merge,之后配置它的封装脚本,不同的操作平台,请参考相关的操作指南,这里以Linux平台为主,在合并脚本extMerge中,可调用P4Merge的二进制执行文件,并提供相应的执行参数,
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*
diff封装脚本可支持7个执行参数,同时可将其中的两个参数,传递给合并脚本,Git会将以下执行参数,传递给diff工具,
path old-file old-hex old-mode new-file new-hex new-mode
由于合并脚本只需要old-file和new-file参数,传递之,
$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
开启两个脚本的可执行权限,
$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff
这时用户可使用配置变量,设定上述脚本,merge.tool可设定合并工具,mergetool.<工具名>.cmd可设定,使用合并工具的默认命令,mergetool.<工具名>.trustExitCode可设定默认命令的返回值,可标记默认命令的执行结果,diff.external可设定外部的比较工具,
$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd 'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
$ git config --global mergetool.extMerge.trustExitCode false
$ git config --global diff.external extDiff
用户也可打开~/.gitconfig文件,手动添加上述设置,
[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
trustExitCode = false
[diff]
external = extDiff
完成设置后,可运行比较命令,
$ git diff 32d1776b1^ 32d1776b1
从上图可知,比较输出并未显示在命令行,而是出现在P4Merge的图形界面中,如果两条分支的合并存在冲突,用户可运行git mergetool,并在P4Merge的图形界面中,手动处理合并冲突,由于存在封装脚本extDiff和extMerge,用户可随意变更不同的外部工具,比如KDiff3,
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
Git也提供了一些不同的合并工具,并且无需设置cmd配置变量,以下是合并工具的支持列表,
$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
emerge
gvimdiff
gvimdiff2
opendiff
p4merge
vimdiff
vimdiff2
The following tools are valid, but not currently available:
araxis
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
kdiff3
meld
tkdiff
tortoisemerge
xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.
如果用户不想使用KDiff3进行差异比较,而是用于合并冲突的处理,可进行以下配置,
$ git config --global merge.tool kdiff3
之后Git将合并冲突处理中,使用KDiff3,并使用git diff进行差异比较。
文件格式与空格
在项目协作过程中,大多数开发者都会遇到,因文件格式和空格所引发的小问题,尤其是在跨平台的环境下,这些问题可能来自于补丁,或者编辑器,又或是不同的操作系统,因此Git提供一些配置变量,帮助用户处理这些问题。
core.autocrlf
由于Windows下,一行文本的行尾使用了回车符(CR)和换行符(LF),而macOS和Linux的行尾只使用了换行符(LF),因此不同的操作系统将引入不同的规则,Windows的大多数编辑器,会将文本行尾的LF标识,替换成CRLF标识,当用户点击回车键时,会插入两个CR标识,配置core.autocrlf变量,可使Git将文件放入暂存区之前,自动将CRLF标识,替换成LF标识,当用户查看工作区的代码时,基于不同的操作系统,又可将LF标识,替换成CRLF标识,因此在Windows系统下,需将core.autocrlf设为true,
$ git config --global core.autocrlf true
如果用户工作在macOS或Linux系统下,则无需将LF替换成CRLF,如果文件本身已包含CRLF标识,依然需要Git将CRLF替换成LF,如下,
$ git config --global core.autocrlf input
如果用户工作在Windows系统下,并且开发项目只支持Windows系统,这时可失效该配置变量,
$ git config --global core.autocrlf false
core.whitespace
Git可检查和修复一些空格问题,并提供了6种选项,3种默认有效,但可以失效,3种默认无效,但可以激活,3种默认有效的选项,分别是blank-at-eol, 检查行尾的空格,blank-at-eof, 检查文件末尾的空白行,space-before-tab, 检查行首tab符号之前的空格,3种默认无效的选项,分别是indent-with-non-tab&#