浏览代码

feat(git): delete squash-merged branches in `gbda` (#11948)

tobi1805 1 年之前
父节点
当前提交
24b2600558
共有 2 个文件被更改,包括 17 次插入2 次删除
  1. 1 1
      plugins/git/README.md
  2. 16 1
      plugins/git/git.plugin.zsh

+ 1 - 1
plugins/git/README.md

@@ -41,7 +41,6 @@ plugins=(... git)
 | `gba`                  | `git branch --all`                                                                                                                                                  |
 | `gba`                  | `git branch --all`                                                                                                                                                  |
 | `gbd`                  | `git branch --delete`                                                                                                                                               |
 | `gbd`                  | `git branch --delete`                                                                                                                                               |
 | `gbD`                  | `git branch --delete --force`                                                                                                                                       |
 | `gbD`                  | `git branch --delete --force`                                                                                                                                       |
-| `gbda`                 | `git branch --no-color --merged \| command grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| command xargs git branch --delete 2>/dev/null` |
 | `gbgd`                 | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d`                                                            |
 | `gbgd`                 | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d`                                                            |
 | `gbgD`                 | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D`                                                            |
 | `gbgD`                 | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D`                                                            |
 | `gbm`                  | `git branch --move`                                                                                                                                                 |
 | `gbm`                  | `git branch --move`                                                                                                                                                 |
@@ -251,6 +250,7 @@ receive further support.
 | `git_develop_branch`     | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. |
 | `git_develop_branch`     | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. |
 | `git_main_branch`        | Returns the name of the main branch: `main` if it exists, `master` otherwise.                                   |
 | `git_main_branch`        | Returns the name of the main branch: `main` if it exists, `master` otherwise.                                   |
 | `grename <old> <new>`    | Renames branch `<old>` to `<new>`, including on the origin remote.                                              |
 | `grename <old> <new>`    | Renames branch `<old>` to `<new>`, including on the origin remote.                                              |
+| `gbda`                   | Deletes all merged and squash-merged branches                                                                   |
 
 
 ### Work in Progress (WIP)
 ### Work in Progress (WIP)
 
 

+ 16 - 1
plugins/git/git.plugin.zsh

@@ -122,7 +122,22 @@ alias gb='git branch'
 alias gba='git branch --all'
 alias gba='git branch --all'
 alias gbd='git branch --delete'
 alias gbd='git branch --delete'
 alias gbD='git branch --delete --force'
 alias gbD='git branch --delete --force'
-alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null'
+
+# Copied and modified from James Roeder (jmaroeder) under MIT License
+# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish
+function gbda() {
+  git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null
+
+  local default_branch=$(git_main_branch)
+  git for-each-ref refs/heads/ "--format=%(refname:short)" | \
+    while read branch; do
+      local merge_base=$(git merge-base $default_branch $branch)
+      if [[ '-*' == $(git cherry $default_branch $(git commit-tree $(git rev-parse $branch\^{tree}) -p $merge_base -m _)) ]]; then
+        git branch -D $branch
+      fi
+    done
+}
+
 alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d'
 alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d'
 alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D'
 alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D'
 alias gbm='git branch --move'
 alias gbm='git branch --move'