git alias to delete local and remote
You can make this work just fine. You just need to add a missing '-' at the end of your definition. The '-' will signal to bash that all option processing is done, and anything that comes after becomes a parameter you can reference via $1
, $2
, etc:
[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" -'
If you create a bin called git-nuke
and place it in a directory anywhere on your $PATH
, you will achieve the same effect. The advantage with this approach is the ability to write a command with a bit more clarity and robustness.
Example, in my bash profile I have: export PATH="$HOME/.bin:$PATH"
.
And in ~/.bin/git-nuke
, I have:
#!/bin/bash
set -eu
#
# git nuke <branch-name>
#
# Delete a branch (irrespective of its merged status) and
# remove from origin.
#
echo "Nuking $1 ..."
if git show-branch "$1" > /dev/null 2>&1
then
git branch -D "$1"
else
echo "No local branch to delete"
fi
git remote prune origin
if git show-branch "origin/$1" > /dev/null 2>&1
then
echo "Deleting remote $1 ..."
git push origin ":$1"
else
echo "No remote branch to delete"
fi
You cannot use $1
in an alias. Create a script called git-nuke
somewhere in your path so you have access to proper shell scripting.
You could also just install git-extras. That’s a script compilation that contains the git delete-branch
script, which does exactly what you want.