Domanda

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.

È stato utile?

Soluzione

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

Altri suggerimenti

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top