Как создать псевдоним Git с вложенными командами с параметрами?

В моих точечных файлах у меня есть следующая функция, которая работает:

function undelete {
  git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
}

... который я использую так:

$ undelete /path/to/deleted/file.txt

Я хотел бы расширить эту команду, так как это команда git.

Как мне создать псевдоним git, чтобы я мог использовать эту команду git alias?

$ git undelete /path/to/deleted/file.txt

Вот две из моих попыток, которые не работают:

git config --global alias.undelete "!f() { git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1; }; f"
git config --global alias.undelete "!sh -c 'git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1' -"

1 ответ

Решение

Это можно сделать с помощью псевдонимов (см . Комментарий Jthill):

git config --global alias.undelete '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1; }; f'
git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'

Я рекомендую написать что-нибудь сложное в виде сценария оболочки:

#! /bin/sh
#
# git-undelete: find path in recent history and extract
. git-sh-setup # see $(git --exec-path)/git-sh-setup

... more stuff here if/as appropriate ...
for path do
    rev=$(git rev-list -n 1 HEAD -- "$path") || exit 1
    git checkout ${rev}^ -- "$path" || exit 1
done

(for Цикл предназначен для того, чтобы разрешить нескольким путевым именам "восстанавливать").

Назовите сценарий git-undelete положи в свой $PATH (Я ставлю сценарии в $HOME/scripts), и каждый раз, когда вы бежите git undelete Гит найдет твой git-undelete сценарий и запустить его (с $PATH модифицировано, чтобы иметь git --exec-path вперед, так что . git-sh-setup работает).

Другие вопросы по тегам