Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Tuesday, December 15, 2015

Git Alias - Multiple Commands and Parameters

Git Alias - Multiple Commands and Parameters


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.

Thanks!

Answer by Olivier Verdier for Git Alias - Multiple Commands and Parameters


This will work (tested with zsh and bash):

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

Answer by Kevin Ballard for Git Alias - Multiple Commands and Parameters


You can define a shell function.

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

Answer by FractalSpace for Git Alias - Multiple Commands and Parameters


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

Answer by brocksamson for Git Alias - Multiple Commands and Parameters


Try this one:

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

Call it like this: git chs master

Answer by gmarik for Git Alias - Multiple Commands and Parameters


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

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

Answer by Ben Collins for Git Alias - Multiple Commands and Parameters


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.

Answer by Brondahl for Git Alias - Multiple Commands and Parameters


Apolgies for necro-ing the question, but I've now solved the remaining problem with the primary answer (solved for Windows batch / msysgit bash, don't know about 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

Answer by VitalyB for Git Alias - Multiple Commands and Parameters


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.


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 71

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.