Search code examples
gitshellcommandaliasgit-alias

git alias to delete local and remote


I'm trying to write an alias to delete both a local and remote branch at the same time, but I can't figure out why the syntax is not working. In ~/.gitconfig, I've tried the following aliases, but each produces the same result, which is unexpected:

[alias]
     nuke = !sh -c 'git branch -D $1 && git push origin :$1'

and

[alias]
     nuke = !git branch -D $1 && git push origin :$1

both produce:

$> git branch
  * master
  mybranch
$> git nuke mybranch
Everything up-to-date
$> git branch
  * master
  mybranch

Switching the order of the commands produces a different result, but also not entirely what I'm looking for:

[alias]
    nuke = !git push origin :$1 && git branch -D $1

...

$> git branch
  * master
  mybranch
$> git nuke mybranch
Everything up-to-date
Deleted branch mybranch (was d719895)
$> git branch
  * master
$> git push origin :mybranch
To git@github.com:biegel/repo.git
 - [deleted]         mybranch

When I run that command directly on the shell, it works nicely:

$> git branch
* master
  mybranch
$> git branch -D mybranch && git push origin :mybranch
Deleted branch mybranch (was d719895
To git@github.com:biegel/repo.git
 - [deleted]         mybranch
$> git branch
* master

I've tried creating an alias in ~/.bashrc, using git push origin --delete $1 and using a shell function with !f() { }; and nothing seems to take!

I'm ready to give up. Any thoughts on what I'm missing here?

Thanks.


Solution

  • You can make this work just fine. You just need to add a missing command name at the end of your definition. The command name will become $0 and everything after will get assigned to $1, $2, etc. In this case, I simply used - as the command name:

    [alias]
         nuke = !sh -c 'git branch -D $1 && git push origin :$1' -
    

    From the command line, switch to another branch, then run the command:

    git nuke branch-name
    

    Alternately… If you are unable to add the above to your .gitconfig file for some reason, but have access to the .bashrc, .bash_profile, etc… you can add the following:

    git config --global alias.nuke '!sh -c "git branch -D $1 && git push origin :$1" -'
    

    You can read more about sh and how it's expected to work here.