Git Alias - несколько команд и параметров
Я пытаюсь создать псевдоним, который использует как несколько команд Git, так и позиционные параметры. Для каждого есть страницы Stackru, и кажется, что делать то и другое мучительно очевидно, но у меня возникли проблемы.
В качестве примера я хочу перейти на ветку foo и выполнить статус. Так по моему .gitconfig
, Я имею:
[alias]
chs = !sh -c 'git checkout $0 && git status'
который не работает. В то время как что-то подобное будет работать.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Любое понимание будет оценено.
12 ответов
Это будет работать (протестировано с zsh и bash):
[alias] chs = !git checkout $1 && git status
Это предназначается для Windows batch / msysgit bash; может не работать в других средах.
Как сказали Оливье Вердиер и Кевин Баллард
[alias] chs = !git checkout $1 && git status
почти работает, но дает ложную дополнительную вставку аргумента...
git chs demo -> git checkout demo && git status demo
Но если вы добавите && :
до конца вашего псевдонима, тогда ложный аргумент будет использован в теге location.
Так
[alias] chs = !git checkout $1 && git status && :
дает правильный вывод...git chs demo -> git checkout demo && git status
Вы можете определить функцию оболочки.
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
Мне удалось создать многострочные и довольно сложные псевдонимы git. Они отлично работают на Windows, но я предполагаю, что они будут работать и в других местах, например:
safereset = "!f() { \
trap 'echo ERROR: Operation failed; return' ERR; \
echo Making sure there are no changes...; \
last_status=$(git status --porcelain);\
if [[ $last_status != \"\" ]]; then\
echo There are dirty files:;\
echo \"$last_status\";\
echo;\
echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
read dirty_operation;\
if [ \"$dirty_operation\" == \"Y\" ]; then \
echo Resetting...;\
git reset --hard;\
elif [ \"$dirty_operation\" == \"W\" ]; then\
echo Comitting WIP...;\
git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
else\
echo Operation cancelled;\
exit 1;\
fi;\
fi;\
}; \
f"
Я написал пост и у меня есть еще несколько примеров здесь.
[alias]
chs = !git checkout & git status
ac = !git add . & git commit -m
что ! ?
Если расширение псевдонима предваряется восклицательным знаком, оно будет рассматриваться как команда оболочки. Что означает восклицательный знак в псевдониме git config?
Для вызова псевдонима из файла .gitconfig
git chs
git ac "write_your_commit_message"
псевдоним более полезен для добавления и фиксации в git, вы можете сделать быстрее
Можно добавить многострочный псевдоним git, добавив \
в конце каждой строки.
[alias]
chs = "!git checkout $1 \
; git status \
"
Попробуй это:
[alias]
chs = "!sh -c 'git checkout \"$0\" && git status'"
Назовите это так: git chs master
Проблема здесь в том, что позиционные параметры, похоже, отправляются в команду оболочки дважды (начиная с git 1.9.2). Чтобы понять, что я имею в виду, попробуйте это:
[alias]
test = !git echo $*
Затем сделать git test this is my testing string
, Вы должны наблюдать следующий вывод (последние две строки отредактированы здесь для ясности):
03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
#1 #2
Один из способов обойти это было бы
[alias]
chs = !git checkout $1 && git status && git echo x >/dev/null
Это будет использовать дополнительный позиционный параметр при его применении к последней команде эха и не повлияет на результаты.
Пример для людей, которые хотят попробовать, что делают разные псевдонимы.
Поместив это в раздел псевдонимов конфигурационного файла GIT (например,
~/.gitconfig
):
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
А затем выполните эту команду:
cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \
echo "" ; \
export CMD ; \
for I in {0..6} ; \
do \
CMD="a""${I}" ; \
echo -n "Executing alias.${CMD} = " ; \
git config --global alias."${CMD}" ; \
git $CMD 'hoi daar' en nu? ; \
git $CMD hoi daar en nu? ; \
echo "" ; \
done ; \
unset CMD ;
Должен дать это как результат:
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
Executing alias.a0 = !echo $*
hoi daar en nu? hoi daar en nu?
hoi daar en nu? hoi daar en nu?
Executing alias.a1 = !echo $* #
hoi daar en nu?
hoi daar en nu?
Executing alias.a2 = !f () { echo "$*"; }; f
hoi daar en nu?
hoi daar en nu?
Executing alias.a3 = !f () { echo "$*"; }; f #
Executing alias.a4 = !f () { echo "$*"; }; f "$*" #
hoi daar en nu?
hoi daar en nu?
Executing alias.a5 = !f () { echo "$*"; }; f "$@" #
hoi daar en nu?
hoi daar en nu?
Executing alias.a6 = !f () { echo "$*"; }; f "$1" #
hoi daar
hoi
Это старый пост, но никто не предоставил то, что я считаю самым простым решением. Это работает в моем CLI на основе *nix, ваш пробег может отличаться.
[alias]
chs = "!git checkout $1; git status"
Простая точка с запятой (;) — это все, что вам нужно для запуска нескольких команд git.
Поскольку у Лили Баллард есть хороший ответ с помощью функции оболочки, он выглядит лучше, когда мы передаем все аргументы-псевдонимы:
[alias] chs = "!f(){ git checkout \"${@:1}\" && git status; };f"