Синтаксис псевдонимов Git с несколькими командами

Я хочу создать псевдоним Git для выполнения нескольких команд, но я не могу найти документацию о том, как это сделать.

  1. Каков синтаксис псевдонимов Git с несколькими командами?
  2. Где это задокументировано?

Из 'man git-config'

   alias.*

Псевдонимы команд для оболочки команд git(1) - например, после определения "alias.last = cat-file commit HEAD", вызов "git last" эквивалентен "git cat-file commit HEAD". Чтобы избежать путаницы и проблем с использованием скриптов, псевдонимы, которые скрывают существующие команды Git, игнорируются. Аргументы разделяются пробелами, поддерживается обычное цитирование и экранирование. пара кавычек и обратная косая черта могут быть использованы для их цитирования.

Если расширение псевдонима начинается с восклицательного знака, оно будет рассматриваться как команда оболочки. Например, при определении "alias.new =! Gitk --all --not ORIG_HEAD" вызов "git new" эквивалентен выполнению команды оболочки "gitk --all --not ORIG_HEAD". Обратите внимание, что команды оболочки будут выполняться из каталога верхнего уровня репозитория, который не обязательно может быть текущим каталогом. GIT_PREFIX устанавливается как возвращаемое путем запуска git rev-parse --show-prefix из исходного текущего каталога. Смотрите git-rev-parse(1).

3 ответа

Решение
$ git config alias.q '!echo a; echo b'

$ git q

Выход:

a
b

Я думаю, что это (элементарно) задокументировано в man git-config под alias.*

Обратите внимание, что команды git должны включать git, в отличие от обычных псевдонимов. Это вызвано тем, что она рассматривается как команда оболочки, а не как команда git (см. Man-страницу, цитируемую в вопросе). Например, чтобы цепочка

git init

а также

git commit --allow-empty -m "empty initial commit"

необходимо создать

"!git init; git commit --allow-empty -m \"empty initial commit\""

псевдоним.

Скажите, что команды echo a а также echo b (не a а также b), чтобы добавить несколько команд для псевдонима q:

Из командной строки:
git config alias.q '!echo a; echo b'

Прямо в файле конфигурации:

[alias]
    q = "!echo a; echo b"

Для более сложных вещей определите функцию оболочки и вызовите ее:
'!f() { echo a ; echo b ; }; f'

Для передачи параметров командам смотрите:
Git псевдоним с позиционными параметрами
Git Alias ​​- несколько команд и параметров

Основано на комментарии Jonathan Wakely

Дополнение Ответ: Часто мне нужны более сложные команды, которые решают, что делать через позиционные параметры, и переходят по параметрам или перебирают параметры или входные файлы.

Такие команды слишком сложны для однострочников, и их трудно читать и редактировать в одной строке. Но я нашел очень простой способ делать очень сложные команды из файлов:

Предположим, у вас есть файл с именем alias/cmd в вашем хранилище:

!function f {
    if [ -z "$1" ]
    then echo "Please give me some argument!" 1>&2
        exit -1
    fi
    echo "Hello $1"
}; f

тогда вы можете просто сказать

git config alias.cmd "`cat alias/cmd`"

определить псевдоним cmd из файла и

git config --get alias.cmd > alias/cmd

записать определенный псевдоним в файл.

Я тоже изо всех сил пытался найти себе хороший пример. После некоторых исследований я пришел к выводу:

git config --global alias.purge '!f() { if [ $(git ls-remote --heads origin $1 | wc -l) -eq 1 ]; then git branch -d $1 && git push origin --delete $1; else echo "remote branch not found"; fi } ; f'

Давайте разберем это слева направо, ладно?

git config --global alias. мы уже знаем. Это код, который нам нужен для создания псевдонима. Часто упоминается на этом сайте как [псевдоним]

purge - это сокращенное имя, которое я решил дать своему псевдониму

'f() { начинаем писать нашу функцию

if [ начало нашего оператора if, закрывающее его позже с помощью ]

git ls-remote --heads origin $1 проверяет, существует ли удаленная ветка с указанным нами именем. Возвращаемое значение будет ничем, если нет ветки, в противном случае будет возвращен ссылочный тег. Включив его в $(), мы убедимся, что он известен Bash как команда

| wc -1, добавленный как суффикс, преобразует возвращаемое значение в 0, если нет удаленной ветви, в 1, если есть

-eq 1 превращает всю вложенную команду в логическое значение, читаемое как (returnValue == 1)

ПРИМЕЧАНИЕ: поскольку команды записываются в одну строку, а не \n позади каждой, нам нужно вводить ; после каждой команды

then используется, чтобы объявить, что наша функция должна делать, если логическое значение возвращает true

git branch -d $1 удалит локальную ветвь введенного нами параметра

&& этот логический оператор обеспечит выполнение обеих команд

git push origin - delete $1 удалит удаленную ветвь введенного нами параметра

else делает то, что должна делать вторая половина if-else

echo "удаленная ветка не найдена" - строка, которую я хочу вернуть, если нет удаленной ветки

fi объявляет об окончании нашего оператора if-else

}; f' закрывает нашу функцию

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