Я пришел к тому же выводу, что и ответ Брайана Филипса - вам нужно выполнить собственную диспетчеризацию для расширения существующих команд git.В отличие от Брайана, я усложнил задачу, настаивая на том, чтобы диспетчерская программа все еще называлась «git».: -)
В .profile
найдите и запишите реальные места git
## PERSONALBIN is my local bin dir
tempath=$(echo $PATH | sed "s|;$PERSONALBIN:|;|")
REALGIT=$(PATH=$tempath; hash -r ; which git)
export REALGIT
В качестве альтернативы, если вы не отслеживаете свой личный мусорный ящик в envvar, и выуверены, что за git
в PATH находится система git
, вы можете заменить приведенную выше настройку REALGIT
на:
REALGIT=$(hash -r; which -a git | head -2 | tail -1 )
В $PERSONALBIN/git
вызовите мой скрипт или реальный git:
declare command=$1; shift
declare extend_script="git-${command}"
if which "$extend_script" 1>/dev/null 2>/dev/null
then
echo "--- Dispatched to a local git- script"
"$extend_script" "$@"
else
echo "--- Dispatched to git"
"${REALGIT} "${command}" "$@"
fi
exit $?
Если бы это была новая команда git foobar
, я мог бы написать $PERSONALBIN/git-foobar
, чтобы просто делать то, что я хочу.Однако, поскольку я расширяю существующую команду, я должен отправить все, что моя команда не обрабатывает.Итак, в $PERSONALBIN/git-worktree
:
declare action=$1
shift;
if [[ "$action" =~ -h ]]
then
script-usage
exit 0
fi
action_func_name="git-worktree-${action}"
if declare -F "$action_func_name" >/dev/null
then
"$action_func_name" "$@"
else
## Dispatch to real git worktree
"${REALGIT} worktree "$action" "$@"
fi
exit $?
я оставляю читателю в качестве упражнения извлечение этого бита в общую функцию, которую вы можете подключить к нескольким местам, изменяя только аргументы.