Ответ 1
Это будет работать (проверено с помощью zsh и bash):
[alias] chs = !git checkout $1 && git status
Я пытаюсь создать псевдоним, который использует как несколько команд Git, так и позиционные параметры. Для каждого из них есть страницы Stackoverflow, и было бы больно очевидным сделать то и другое, но у меня возникают проблемы.
В качестве примера я хочу перейти на ветвь foo и выполнить статус. Итак, в моем .gitconfig
у меня есть:
[alias]
chs = !sh -c 'git checkout $0 && git status'
который не работает. Если что-то вроде этого будет работать.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Любое понимание будет оценено.
Это будет работать (проверено с помощью zsh и bash):
[alias] chs = !git checkout $1 && git status
Вы можете определить функцию оболочки.
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
Это предназначено для пакета Windows/msysgit bash; может не работать в других средах.
Как Оливье Вердье и Кевин Баллард сказали
[alias] chs = !git checkout $1 && git status
почти работает, но дает ложную дополнительную вставку аргумента...
git chs demo -> git checkout demo && git status demo
Но если вы добавите && :
в конец своего псевдонима, то ложный аргумент будет использован в теге местоположения.
So
[alias] chs = !git checkout $1 && git status && :
дает правильный результат...
git chs demo -> git checkout demo && git status
Мне удалось создать многострочные и довольно сложные псевдонимы 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 branch && git status
Попробуйте следующее:
[alias]
chs = "!sh -c 'git checkout \"$0\" && git status'"
Назовите его так: git chs master
Возможно иметь многострочный псевдоним git, добавив \
в конце каждой строки.
[alias]
chs = "!git checkout $1 \
; git status \
"
Проблема здесь в том, что позиционные параметры, похоже, отправляются в команду оболочки дважды (с git 1.9.2). Чтобы понять, что я имею в виду, попробуйте следующее:
[alias]
test = !git echo $*
Тогда do 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
Это будет использовать дополнительный позиционный параметр, поскольку он применяется к последней команде эха и не влияет на результаты.