Git 以拥有许多子命令而闻名,例如 clone
、init
、add
、mv
、restore
、bisect
、blame
、show
、rebase
等等。 在之前的一篇文章中,我写了非常有用的 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 工作流程中。
评论已关闭。