首页 > 解决方案 > 扩展现有的 git 命令

问题描述

有据可查的是,我可以通过将脚本/程序git-foobar放在我的 $PATH 上来向 git 添加一个新命令,然后我可以调用它作为git foobar.

但是,如果我想扩展现有的 git 命令怎么办?例如,该git worktree命令具有动词 add、list、lock 等。我有一种非常具体的方式来组织我保存的位置以及我如何命名工作树。我编写了一个脚本“git-worktree”,它有一个“main”函数,如下所示:

declare action=$1
shift;

if [[ "$action" =~ -h ]]
then
    script-usage
    return  0
fi

case $action in
    create | delete )
        if [[ "$1" =~ -h ]]
        then
            script-usage
            return  0
        else
            "git-worktree-${action}" "$@"
            return $?
        fi
        ;;
    *)
        "${git_bin}/git-worktree" "$@"
        return $?
        ;;
esac

如果我键入“创建”或“删除”,我会调用脚本中其他地方定义的函数。对于其他任何事情,我只是传递给真正的git worktree命令。

除了它不完全工作。键入git-worktree执行我的脚本。打字git worktree不会运行我的脚本。

是否有我遗漏的东西,或者我不能以与添加新命令相同的方式扩展现有的 git 命令?

标签: extendgit

解决方案


您需要遵循集线器使用的模式,其中您有一个替代脚本,您在 shell 中将其别名为git. 该替代脚本将拦截相关的内置命令并执行您的自定义覆盖脚本。

#!/usr/bin/env bash

# my-git.sh

declare action=$1
shift;

case $action in
    worktree )
        exec git-worktree "$@"
        ;;
    *)
        exec git "$action" "$@"
    ;;
esac

假设上面的脚本在你的路径中的某个地方my-git.sh,你可以alias git=my-git.sh并且它应该可以工作


推荐阅读