Git псевдоним для удаления локальных и удаленных

Я пытаюсь написать псевдоним для одновременного удаления локальной и удаленной ветки, но я не могу понять, почему синтаксис не работает. В ~/.gitconfig я пробовал следующие псевдонимы, но каждый из них производит тот же результат, что неожиданно:

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

и

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

оба производят:

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

Переключение порядка команд дает другой результат, но также не совсем то, что я ищу:

[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 [email protected]:biegel/repo.git
 - [deleted]         mybranch

Когда я запускаю эту команду непосредственно в оболочке, она работает красиво:

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

Я попытался создать псевдоним в ~/.bashrc, используя git push origin --delete $1 и используя функцию оболочки с !f() { };, и ничего не происходит!

Я готов отказаться. Любые мысли о том, что мне здесь не хватает?

Спасибо.

Ответ 1

Вы можете сделать эту работу просто отлично. Вам просто нужно добавить пропущенный "-" в конце вашего определения. '-' будет сигнализировать bash, что вся обработка опций завершена, и все, что последует, становится параметром, на который вы можете ссылаться через $1, $2 и т. Д.:

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

Из командной строки перейдите в другую ветвь и запустите команду:

git nuke branch-name

Альтернативно... Если по какой-то причине вы не можете добавить вышеперечисленное в свой файл .gitconfig, но имеете доступ к файлам .bashrc, .bash_profile и т.д.... вы можете добавить следующее:

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

Ответ 2

Если вы создадите ящик под названием git-nuke и поместите его в каталог в любом месте вашего $PATH, вы получите тот же эффект. Преимущество такого подхода заключается в способности писать команду с большей ясностью и надежностью.

Например, в моем профиле bash у меня есть: export PATH="$HOME/.bin:$PATH".

И в ~/.bin/git-nuke у меня есть:

#!/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

Ответ 3

Вы не можете использовать $1 в псевдониме. Создайте script, называемый git-nuke, где-то в вашем пути, чтобы у вас был доступ к правильному сценарию оболочки.

Вы также можете просто установить git-extras. Это компиляция script, содержащая git delete-branch script, которая делает именно то, что вы хотите.