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.
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.