Синтаксис псевдонимов Git с несколькими командами
Я хочу создать псевдоним Git для выполнения нескольких команд, но я не могу найти документацию о том, как это сделать.
- Каков синтаксис псевдонимов Git с несколькими командами?
- Где это задокументировано?
Из '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' закрывает нашу функцию