制作你自己的Git子命令提高工作效率的方法

254 阅读3分钟

Git因为有很多子命令而相当有名,比如clone,init,add,mv,restore,bisect,blame,show,rebase ,还有更多。在之前的文章中,我写到了Git非常有用的Rev-parse子命令。即使有了这些子命令,用户仍然会想出一些功能来改善他们的 Git 体验。虽然你可以自由地创建与Git相关的命令,并以脚本的形式运行,但你也可以很容易地制作自己的自定义Git子命令。你甚至可以通过rev-parse 将它们与 Git 集成。

更多关于Git的信息

什么是Git?

Git小抄

马克顿小抄

新的Git文章

创建一个简单的 Git 脚本

与 Git 集成的脚本可以是复杂的,也可以是简单明了的。

举个简单的例子,假设你创建了一个脚本,收集最新提交的文件名,并将其放入一个名为latest.txt 的文件中。你在每次提交后都会使用这个脚本来做报告,你决定如果能把这个脚本当做 Git 的内置功能来运行就更好了,比如说用git report 这个命令。

目前,运行git report 会出现这个错误。

$ git report
git: 'report' is not a git command. See 'git --help'.
The most similar command is
        bugreport

这是生成你的报告的脚本。

#!/bin/shTOP=$(git rev-parse --show-toplevel)HASH=$(git log --pretty=format:'%h' -n 1)mkdir "${TOP}"/reports || truegit diff-tree \--no-commit-id --name-only \-r HEAD > "${TOP}"/reports/$HASH

把这个文件作为git-report.sh 保存在你的PATH中。

你不会直接运行这个脚本,所以要在名称中包括.sh 的扩展名。让这个脚本可以执行。

$ chmod +x git-report.sh

创建前端命令

你可以强迫 Git 通过rev-parse 来运行git report 并启动你的git-report.sh 脚本,而不是返回错误。下面是这个脚本。

#!/bin/sh
git-report.sh

把这个文件保存为git-report (不要使用.sh 文件扩展名),放在你的 PATH 上。让该脚本可执行。

$ chmod +x git-report

运行你的自定义 Git 命令

现在测试一下。首先,创建基础设施和一些样本数据。

$ mkdir myproject ; cd !$
$ git init
$ echo "foo" > hello.txt
$ git add hello.txt
$ git commit -m 'first file'
$ git report

reports 目录中查看最新提交的记录。

$ cat reports/2e3efd8
hello.txt

传递参数给你的脚本

你也可以通过rev-parse ,传递参数。我帮助维护一个叫做Git-portal的Git子命令,它可以帮助管理与Git仓库相关的大型多媒体文件。

它有点像Git LFS或Git Annex,只是没有实际媒体文件的版本管理费用。(文件的符号链接被保存在版本控制之下,但文件的内容被独立处理,这在艺术过程与开发过程不同的情况下非常有用。)

为了将Git-portal与Git的子命令结合起来,我使用了一个简单的前端shell脚本,它又调用了rev-parse ,进行字面解析。

本文提供的示例脚本不能接受任何参数,但我实际编写的 Git 脚本几乎都是这样。下面是参数的传递方式,比如说,传递给 Git-portal 的参数。

#!/bin/shARG=$(git rev-parse --sq-quote "$@")CMD="git-portal.sh $ARG"eval "$CMD"

--sq-quote 选项引用了git portal 之后的所有参数,并将它们作为git-portal.sh 的新参数,该脚本中包含了所有有用的功能。一个新的命令被集合到CMD 变量中,然后该变量被评估和执行。

这里有一个你可以运行的简单例子。这是一个脚本的修改版,我用它来调整图片的大小和应用准确的版权(或版权复制,视情况而定)EXIF数据,我用Git来管理一个平面文件CMS。

这是个简化的例子,而且这个脚本没有很好的理由成为Git的子命令,但它是示范性的。你可以发挥你的想象力,找到使用Git功能的扩展方法。

将此文件称为git-imager.sh

#!/bin/sh## Requires# GNU Bash# exiftool (sometimes packaged as perl-Image-exiftool)# Image MagickPIC="${1}"COPY="-Copyright"LEFT="${2}"
mogrify -geometry 512^x512 -gravity Center \
        -crop 512x512+0+0 "${1}"
exiftool -Copyright="${2}" "${1}"

用于整合 Git 的前端脚本将所有参数(文件名和许可证)传递给git-imager.sh 脚本。

#!/bin/shARG=$(git rev-parse --sq-quote "$@")CMD="git-imager.sh $ARG"eval "$CMD"

试一试吧。

$ git imager logo.jpg "Tux CC BY-SA"
 1 image files updated

轻松定制Git

创建自己的 Git 子命令让你的自定义脚本感觉像是 Git 的自然组成部分。对于用户来说,它使新的子命令易于记忆,并帮助你的子命令融入到每个人的Git工作流程中。