创建你自己的 Git 子命令

创建你自己的 Git 子命令可以使你的自定义脚本感觉像是 Git 的自然组件。
5 位读者喜欢这篇文章。
Woman sitting in front of her computer

Ray Smith

Git 以拥有许多子命令而闻名,例如 cloneinitaddmvrestorebisectblameshowrebase 等等。 在之前的一篇文章中,我写了非常有用的 Git rev-parse 子命令。 即使有所有这些可用的子命令,用户仍然会提出一些功能来改善他们的 Git 体验。 虽然你可以自由地创建与 Git 相关的命令并将它们作为脚本运行,但很容易创建你自己的自定义 Git 子命令。 你甚至可以通过 rev-parse 将它们与 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/sh

TOP=$(git rev-parse --show-toplevel)
HASH=$(git log --pretty=format:'%h' -n 1)

mkdir "${TOP}"/reports || true

git 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/sh

ARG=$(git rev-parse --sq-quote "$@")
CMD="git-portal.sh $ARG"
eval "$CMD"

--sq-quote 选项引用 git portal 之后的所有参数,并将它们作为 git-portal.sh 的新参数包含在内,这是包含所有有用函数的脚本。 一个新命令被组装到 CMD 变量中,然后评估并执行该变量。

这是一个你可以运行的简单示例。 它是用来调整大小并将准确的版权(或 copyleft,视情况而定)EXIF 数据应用到图像的脚本的修改版本,用于我使用 Git 管理的平面文件 CMS。

这是一个简化的例子,这个脚本没有充分的理由成为 Git 子命令,但它具有示范性。 你可以发挥你的想象力来找到扩展它的方法,以使用 Git 函数。

将此文件命名为 git-imager.sh

#!/bin/sh
## Requires
# GNU Bash
# exiftool (sometimes packaged as perl-Image-exiftool)
# Image Magick

PIC="${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/sh

ARG=$(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 工作流程中。

标签
Seth Kenlon
Seth Kenlon 是一名 UNIX 爱好者、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,而且经常同时从事这两项工作。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.