问题
I am trying to create an alias that uses both multiple Git commands and positional parameters. There are Stackoverflow pages for each, and it would appear painfully obvious to do both, but I am having trouble.
As an example, I want to switch to branch foo and perform a status. So in my .gitconfig
, I have:
[alias]
chs = !sh -c \'git checkout $0 && git status\'
which doesn\'t work. Whereas something like this will work.
chs = !sh -c \'git checkout $0\'
echoes = !sh -c \'echo hi && echo bye\'
Any insight would be appreciated.
回答1:
This will work (tested with zsh and bash):
[alias] chs = !git checkout $1 && git status
回答2:
You can define a shell function.
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
回答3:
This targets Windows batch / msysgit bash; might not work on other environments.
As Olivier Verdier and Kevin Ballard have said
[alias] chs = !git checkout $1 && git status
almost works, but gives a spurious extra insertion of the argument ...
git chs demo -> git checkout demo && git status demo
But if you add && :
to the end of your alias, then the spurious argument is consumed into a location tag.
So
[alias] chs = !git checkout $1 && git status && :
gives the correct output ...
git chs demo -> git checkout demo && git status
回答4:
I was able to create multi-line and quite complex git aliases. They work fine on Windows but I assume they'd work elsewhere too, for example:
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"
I wrote a post and have a few more examples here.
回答5:
[alias]
chs = !git branch && git status
回答6:
Try this one:
[alias]
chs = "!sh -c 'git checkout \"$0\" && git status'"
Call it like this: git chs master
回答7:
It's possible to have multiline git alias by appending \
at the end of each line.
[alias]
chs = "!git checkout $1 \
; git status \
"
回答8:
The problem here is that the positional parameters seem to be getting sent to the shell command twice (as of git 1.9.2). To see what I mean, try this:
[alias]
test = !git echo $*
Then, do git test this is my testing string
. You should observe the following output (last two lines edited here for clarity):
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
One way to work around this would be to
[alias]
chs = !git checkout $1 && git status && git echo x >/dev/null
This will consume the extra positional parameter as it gets applied to that last echo command and have no effect on the results.
来源:https://stackoverflow.com/questions/7534184/git-alias-multiple-commands-and-parameters