Git是现代开发团队必不可少的版本控制工具,本文将介绍几个有用的配置技巧来创建一个更智能的开发环境,从而极大地提高效率和节约时间。
命令行提示符
Git命令行提示符能够显示当前目录下Git仓库的信息。如果没有和Git一起安装,只需将源代码中contrib/completion/git-prompt.sh复制到某个目录(例如主目录),在.bashrc文件中添加如下命令。
$ cp /home/opensource/git/contrib/completion/git-prompt.sh ~
$ vim ~/.bashrc
source ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export PS1='[\u@\h:\w$(__git_ps1 " (%s)")]\$ '
$ source ~/.bashrc
\u表示当前用户,\h表示当前主机名,\w表示当前工作目录,__git_ps1 " (%s)" 表示通过格式化参数符(%s)调用git-prompt.sh脚本中提供的函数。仓库状态中*表示未暂存的变更,+表示已暂存变更。
命令行自动补齐
Git命令行自动补齐支持用户输入一个命令或者文件名的头几个字符,然后按下自动补齐键(通常是Tab键)补齐其余的字符,这项功能适用于 Git所有的子命令、命令行选项、以及远程仓库与引用名。如果没有和Git一起安装,只需将源代码中contrib/completion/git-completion.bash脚本复制到某个目录(例如主目录),在.bashrc文件中添加如下命令。
$ cp /home/opensource/git/contrib/completion/git-completion.bash ~
$ vim ~/.bashrc
source ~/git-completion.bash
$ source ~/.bashrc
命令行自动纠正
Git内置自动纠正功能,如果配置变量help.autoCorrect被设置为一个正数值,那么Git会自动纠正输入错误的命令,并等待一定时间之后执行该命令(十分之一秒)。
$ git config --global help.autocorrect 50 # 等待5秒后自动执行纠正的命令
# git config --global help.autocorrect 0 # 关闭自动纠正功能,避免不必要的干预
说明:系统如果发现输入的文本中包含一个以上的命令,那么将不会执行它们。Git用户无法自动纠正子命令、参数和选项(和自动补全正好相反)。
命令行彩色输出
Git支持对终端内容着色,有利于从视觉上识别命令的输出,对快速分析命令输出有很大帮助。
$ git config --global color.ui auto # 开启彩色输出---输出到终端时会使用彩色,而重定向到文件或者管道时忽略颜色控制代码
# git config --global color.ui false # 关闭彩色输出
换行符处理
Git可以在提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。Windows使用回车(Carriage Return,CR)和换行(Line Feed,LF)两个字符来结束一行,而macOS和Linux只使用换行(LF)一个字符。
$ git config --global core.autocrlf true # 开启换行符转换(Windows系统)
# git config --global core.autocrlf input # 开启换行符转换(Linux系统)
# git config --global core.autocrlf false # 关闭换行符转换
空白字符处理
Git可以探测和修正多余空白字符问题。
blank-at-eol 在行尾出现的空白字符视为错误
space-before-tab 在行首缩进中出现在tab前面的空白字符视为错误
indent-with-non-tab 使用空格进行缩进视为错误(强制使用tab缩进)
tab-in-indent 使用tab进行缩进视为错误(强制使用空格缩进)
blank-at-eof 在文件末尾的空白行视为错误
trailing-space 行尾的空白字符,blank-at-eol和blank-at-eof的缩写形式
cr-at-eol 行尾的回车
tabwidth=<n> tab宽度(占用字符数)
# 以逗号分隔的选项列表,选项前添加“-”符号表示禁用该选项
$ git config --global core.whitespace trailing-space,space-before-tab,-indent-with-non-tab,tab-in-indent,cr-at-eol
文本编辑器
Git会调用通过环境变量$VISUAL或$EDITOR设置的文本编辑器,如果没有设置,默认会调用vim来编辑提交和标签信息。可以使用core.editor选项来修改默认的编辑器。
$ git config --global core.editor vim # Vim编辑器
# git config --global core.editor emacs # Emacs编辑器
# git config --global core.editor "atom --wait" # Atom编辑器
分页器
Git运行诸如log和diff等命令所使用的分页器,可以把它设置成more或者任何喜欢的分页器。如果设置成空字符串则表示关闭该选项,这样不管命令的输出量多少,Git都会在一页显示所有内容。
$ git config --global core.pager more # 分页器为more
# git config --global core.pager less # 分页器为less
# git config --global core.pager '' # 关闭分页器
提交模板
Git会使用该文件的内容作为提交的默认初始化信息。如果团队对提交信息有格式要求,可以在系统上创建一个文件,并配置Git把它作为默认的模板,这样可以更加容易地使提交信息遵循格式。
$ vim ~/.gitmessage # 创建提交模板
# feature change: Add a function description
# code optimization: Add optimized description
# fix bug: [bug_no] Add problem description
$ git config --global commit.template ~/.gitmessage # 设置提交模板
$ git commit # 提交变更
忽略文件
Git使用忽略文件指定某些文件(例如机密文件、中间文件或日志文件)不需要纳入版本控制,也不需要出现在未追踪文件列表中。
-
共享的仓库级忽略文件(local):
.gitignore(自身需要提交到存储库),忽略文件模板详见github/gitignore或gitignore.io -
独享的仓库级忽略文件(private):
.git/info/exclude -
独享的全局级忽略文件(global): 由配置变量core.excludesFile指定,默认为
$XDG_CONFIG_HOME/git/ignore
$ git config --global core.excludesFile ~/.gitignore_global
创建忽略文件
(1)git-extras扩展命令
方式1:git ignore
# 查看忽略文件,支持选项-l|--local、-g|--global、-p|--private
$ git ignore
$ git ignore --global
# 添加忽略文件
$ git ignore --local build "*.o" "*.log"
方式2:git ignore-io
# 查看忽略文件
$ git ignore-io Go
# 导出忽略文件,支持选项-a|--append、-r|--replace,仅支持导出到.gitignore
$ git ignore-io --replace Go
$ git ignore-io Go > .gitignore
(2)gitignore.io命令行接口
# 命令别名
$ git config --global alias.gi '!f() { curl -sL https://www.toptal.com/developers/gitignore/api/$@ ;}; f'
# 创建忽略文件
$ git gi Go > .gitignore
(3)simonwhitaker/gibo命令行接口
$ go install github.com/simonwhitaker/gibo@latest
$ gibo dump Go > .gitignore
(4)karan/joe命令行接口
# 由于https://github.com/karan/joe很久未更新无法直接使用,需要派生后做些修改
$ go install github.com/leitiannet/joe@latest
$ joe update
$ joe list
$ joe generate go > .gitignore
属性文件
Git通过属性文件为某些文件或目录添加属性,设置属性的文件或目录在执行Git相关操作时会做特殊处理。属性文件是一个普通的文本文件,每一行对一个路径(可使用通配符)设置相应的属性。语法格式如下:
<pattern> <attr1> <attr2> ...
-
共享的仓库级属性文件:
.gitattributes(自身需要提交到存储库),属性文件模板详见gitattributes.io。 -
独享的仓库级属性文件
.git/info/attributes -
独享的全局级属性文件:由配置变量core.attributesFile指定,默认为
$XDG_CONFIG_HOME/git/attributes
$ git config --global core.attributesFile ~/.gitattributes_global
创建属性文件
# 命令别名
$ git config --global alias.ga '!f() { curl -sL https://gitattributes.com/api/$@ ;}; f'
# 创建属性文件
$ git ga go,vim > .gitattributes
命令别名
$ git config --global alias.ci commit # 提交变更
$ git config --global alias.co checkout # 检出分支
$ git config --global alias.ca '!git add -A && git commit -av' # 提交所有修改
$ git config --global alias.st 'status -sb' # 以简短格式输出状态
$ git config --global alias.branches 'branch -a' # 查看所有本地分支和远程分支
$ git config --global alias.tags 'tag -l' # 查看所有标签
$ git config --global alias.remotes 'remote -v' # 查看所有远程仓库
$ git config --global alias.glog 'log --graph --oneline --decorate --abbrev-commit' # 查看提交历史图表
$ git config --global alias.ls 'log -n 20 --graph --oneline --pretty=format:"%h <%an> %ar %s"' # 查看提交历史图表,一行显示,自定义格式
$ git config --global alias.unstage 'reset HEAD --' # 取消暂存
$ git config --global alias.cleanup '!git branch --merged | grep -v "*" | xargs git branch -d' # 删除所有合并过的分支
$ git config --global alias.visual '!gitk' # 可视化查看提交历史
$ git config --global alias.go '!f() { git checkout -b "$1" 2> /dev/null || git checkout "$1"; }; f' # 切换分支
扩展命令
git-extras是一个Git的扩展工具集,提供很多实用且高效的命令。git-extras使用Shell脚本语言开发,安装过程详见Installation.md,命令列表详见Commands.md。
Linux
方式1:
$ sudo apt-get install git-extras
方式2:
$ git clone https://github.com/tj/git-extras.git
$ cd git-extras
# checkout the latest tag
$ git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
$ sudo make install PREFIX=/usr/local/git-extras
Windows
$ git clone https://github.com/tj/git-extras.git
$ cd git-extras
# checkout the latest tag (optional)
$ git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
$ 执行install.cmd