Git知识点:功能扩展

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			# 查看文件修改信息

参考资料

Git Source Code Mirror

git-config

git-sh-setup

《Git权威指南》

相关推荐
m0_4648323635 分钟前
Linux服务器上安装git lfs命令
git
贩卖纯净水.8 小时前
白月光git
git·github
爱吃瓜的猹z12 小时前
git reset 几点疑问
git·源代码管理
悟空201618 小时前
001、Git开发流程规范
git
Li小李同学Li18 小时前
git学习【持续更新中。。。】
git·学习·elasticsearch
晨春计20 小时前
【git】
android·linux·git
念幽21 小时前
Git常用命令
git
神技圈子21 小时前
【git系列】git中的那些迷惑的术语以及概念详解
git
benben0441 天前
Photoshop使用方法大全
git
ou.cs1 天前
git 删除远程分支的几种写法
git