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权威指南》

相关推荐
唔知小罗1 小时前
git config是做什么的?
git
不是鱼7 小时前
新人程序猿必备的git技能(超实用基础版)
git·github
Exclusive_Cat10 小时前
Git的使用(基础语句)
git
江上清风山间明月10 小时前
git撤销、回退某个commit的修改
git·commit·版本·撤销·回退·特定
cui_win10 小时前
Redis高可用-主从复制
redis·git·github·主从复制·哨兵
Anlici13 小时前
大厂怎么用Git命令
git
谎言西西里14 小时前
Git入门指南:掌握基本概念与日常操作
git·github
程序员buddha15 小时前
git版本工具使用教程
git
tian-ming20 小时前
技术栈2:Git分布式版本控制工具
git
算你狠 - ZGX21 小时前
Git - 日志
git