Git Alias - Multiple Commands and Parameters

天涯浪子 提交于 2019-11-26 11:36:32

This will work (tested with zsh and bash):

[alias] chs = !git checkout $1 && git status

You can define a shell function.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
Brondahl

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

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.

[alias]
chs = !git branch && git status

Try this one:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

Call it like this: git chs master

It's possible to have multiline git alias by appending \ at the end of each line.

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!