Git是一个功能非常强大的分布式版本控制系统,它提供了大量内置命令进行版本管理。在实际使用中,可能需要自定义一些特定的命令来简化工作流程。在不需要修改Git源代码的基础上,Git为用户提供了一些可以对它进行功能扩展的机制,根据自己的需求选择适合的方式来自定义Git命令。
命令别名
Git中创建命令别名非常简单,只需要通过git config alias.<name> <command>
创建一个配置变量即可。别名可以为频繁使用的命令和参数(参数通过空格进行分隔)创建快捷方式,方便记忆和简化输入。此外,别名可以执行外部命令,从而用来创建新的命令。注意:用户不能添加和Git命令同名的别名,即不能使用别名来改变Git命令的行为!!!
如果需要执行外部命令,或希望将若干独立命令的执行结果串联。在这种情况下,用户可以在别名前面加上!符号(带感叹号)。定义并马上执行一个shell函数,允许用户使用标准的shell参数进行处理,参见github.com/mathiasbyne...
shell
$ 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_TRACE=true git go dev
命令扩展
Git会安装很多以git-<command>
格式命名的子命令到执行路径中(执行git --exec-path命令查看,通常为/usr/lib/git-core),这些子命令其实都是git的软链接、硬链接或副本。
对于一些对运行效率要求不高的命令,Git使用Shell、Perl和Python脚本语言开发,实际上git pull、git rebase、git filter-branch和git submodule等都是Shell脚本。但随着Git的发展,一些子命令也会改用C语言改写,例如,git stash在git-1.7.0版本中由Shell脚本编写(git-stash.sh),而在git-2.25.1版本中由C语言编写(stash.c)。
shell
# git-1.7.0版本
$ file /usr/local/git-1.7.0/libexec/git-core/git-stash
/usr/local/git-1.7.0/libexec/git-core/git-stash: POSIX shell script, ASCII text executable
# git-2.25.1版本
$ file /usr/lib/git-core/git-stash
/usr/lib/git-core/git-stash: symbolic link to git
$ file /usr/lib/git-core/git
/usr/lib/git-core/git: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=97a2b422a8e47c8b87afcc0825cff418162af9d9, for GNU/Linux 3.2.0, stripped
可以参考Git中脚本文件来实现更复杂的功能。
- 执行
git <command>
检查是否有同名的命令存在 - 创建脚本文件,以
git-<command>
格式命名 - 使用Shell或者其他脚本语言编写逻辑,git-sh-setup是Git提供的用于Shell编程的函数库
- 将脚本文件放到Git执行路径或PATH目录中
- 执行
git <command>
调用脚本文件
如果git <command>命令不是一个内置的Git命令,包装器会首先在Git执行路径上进行搜索,然后在环境变量$PATH中搜索。后者使得在不访问系统空间的情况下编写本地Git扩展(本地Git命令)成为可能。
shell
$ git local
git: 'local' is not a git command. See 'git --help'.
$ GITEXTENSIONSDIR=/c/installs/git-extensions
$ mkdir -p $GITEXTENSIONSDIR
$ cd $GITEXTENSIONSDIR
$ vim git-local
#!/bin/sh
#
# Example for extension
dashless=$(basename "$0" | sed -e 's/-/ /')
USAGE="add [<options>]
or: $dashless commit [<options>]
or: $dashless log [<options>]"
. "$(git --exec-path)/git-sh-setup"
cmd_add()
{
git add "$@"
}
cmd_commit()
{
git commit "$@"
}
cmd_log()
{
git log "$@"
}
case "$1" in
add)
shift
cmd_add "$@"
;;
commit)
shift
cmd_commit "$@"
;;
log)
shift
cmd_log "$@"
;;
*)
usage
;;
esac
# 调试命令
$ bash -x git-local log --oneline --graph
# 执行命令
$ git local -h
usage: git local add [<options>]
or: git local commit [<options>]
or: git local log [<options>]
$ git local log --oneline --graph
三方工具
tj/git-extras是一个Git的扩展工具集,提供很多实用且高效的命令。git-extras使用Shell脚本语言开发,安装过程详见Installation.md,命令列表详见Commands.md。
(1)安装Git for Windows 2.x
(2)克隆git-extras仓库
shell
$ 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))
(3)执行install.cmd
(4)测试git-extras是否安装
shell
$ git extras --version
$ git extras --help
(4)使用git-extras
shell
$ git alias # 定义、设置和查看别名
$ git ignore # 添加忽略(.gitignore)
$ git info # 查看仓库信息
$ git summary # 查看仓库概括
$ git count # 查看提交次数
$ git effort # 查看文件修改信息