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, которая делает именно то, что вы хотите.