Git知识点:提升Git使用效率的配置技巧

1,506 阅读4分钟

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脚本中提供的函数。仓库状态中*表示未暂存的变更,+表示已暂存变更。

image.png

命令行自动补齐

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

image.png

命令行自动纠正

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					  # 提交变更

image.png

忽略文件

Git使用忽略文件指定某些文件(例如机密文件、中间文件或日志文件)不需要纳入版本控制,也不需要出现在未追踪文件列表中。

  • 共享的仓库级忽略文件(local):.gitignore(自身需要提交到存储库),忽略文件模板详见github/gitignoregitignore.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

参考资料

Git - gitignore Documentation

Git - gitattributes Documentation

Ignoring files - GitHub Docs

github/gitignore

gitignore.io

在其它环境中使用 Git - Bash 中的 Git

自定义 Git - 配置 Git

自定义 Git - Git 属性