Question

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.

Was it helpful?

Solution

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" -'

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top