Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions functions/__git.delete_branches.fish
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
function __git.delete_branches -d "Delete multiple branches"
argparse f/force -- $argv

if set -ql _flag_force
set -f delete_flag -D
else
set -f delete_flag -d
end
for branch in $argv
git branch $delete_flag $branch
end
end
22 changes: 17 additions & 5 deletions functions/gbda.fish
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
function gbda -d "Delete all branches merged in current HEAD, including squashed"
git branch --merged | \
# *: current branch, +: current branch on worktree.
command grep -vE '^\*|^\+|^\s*(master|main|develop)\s*$' | \
command xargs -r -n 1 git branch -d
argparse g/gone -- $argv

set -l default_branch (__git.default_branch)

if set -ql _flag_gone
__git.delete_branches --force (
git for-each-ref refs/heads/ --format="%(refname:short) %(upstream:track)" refs/heads/ | \
command awk '$2 == "[gone]" { print $1 }'
)
end

__git.delete_branches (
git branch --merged | \
# *: current branch, +: current branch on worktree.
command grep -vE '^\*|^\+|^\s*(master|main|develop)\s*$' | \
string trim
)

git for-each-ref refs/heads/ "--format=%(refname:short)" | \
while read branch
set -l merge_base (git merge-base $default_branch $branch)
if string match -q -- '-*' (git cherry $default_branch (git commit-tree (git rev-parse $branch\^{tree}) -p $merge_base -m _))
git branch -D $branch
__git.delete_branches --force $branch
end
end
end