自动删除已经合并分支

branchclear-cli 发布了 🎉

现在使用branchclear-cli一键清除已经合并的分支吧!

git branch --merged|--no-merged [分支名]

参数解释

  1. --merged查询已经合并到当前分支的分支名
  2. --no-merged查询未合并到当前分支的分支名
  3. 分支名不加,则默认为当前分支
  4. git branch --merged master查看本地已经合并到 master 分支
  5. git branch -r --merged origin/master查询所有已经合并到远程 master 分支的远程分支

grepegrep

  1. Linux grep 命令用于查找文件里符合条件的字符串

    grep 参数 查询的字符串 文件或目录

  2. egrep相当于grep -E代表使用正则查询文件或目录

  3. grep -v显示不包含匹配文本的所有行

  4. egrep -v '(^\*|master)'显示所有不包含以*开头和 master 的

    不包含*,就不会删除当前分支 在这里插入图片描述

  5. egrep -v "(^\*|master|HEAD)显示所有不包含以*开头和 master 以及 HEAD 的

    git branch -r 会有 HEAD 表示当前分支指向 在这里插入图片描述

Cut

cut命令用于剪切origin/

  • -d :自定义分隔符,默认为制表符。
  • -f :与-d 一起使用,指定显示哪个区域。
  • cut -d '/' -f num 使用/作为分隔符,并且展示第二个

tr

Linux tr 命令用于转换或删除文件中的字符,但 tr 在此并不适用。

tr -d 'origin/' 是 将所有的 orign/替换

sed

sed 's/正则/替换成的字符/g'

sed 's/origin\///g'将文本中origin/替换成空字符

xargs

linux xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

xargs -n num num 表示次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的。

删除本地仓库失效的的远程分支

git remote prune origin

删除本地已经 merged 的分支

git branch --merged | egrep -v '(^\*|master)' |xargs git branch -D

注意:删除之前先确定删除分支

删除远程已经 merged 的分支

  1. 尝试 1:

    git branch -r --merged origin/master |egrep -v '(master|HEAD)'|cut -b '/' -f 2|xargs -n 3 git push origin --delete

    注意:分支名可能包含/,比如分支为 jxw/test。对远程分支 origin/jxw/test cut -b '/' -f 2会得到 jxw 和 test 两个结果。这个时候去删除 jxw 分支是不存在的。所以需使用特殊方法规避。

    优化方案:使用 sed 代替 cut

  2. 尝试二:

    git branch -r --merged origin/master |egrep -v '(master|HEAD)'|sed 's/origin\///g'|xargs -n 3 git push origin --delete

    有些分支删除报错,远程引用不存在。引出问题 git branch -r 查询的不是最新的。git remote prune origin删除失效远程分支

  3. 成功

    git remore prune origin|git branch -r --merged origin/babel-prd-6.5 |egrep -v '(master|HEAD)'|grep 'jxw'|sed 's/origin\///g'|xargs -n 3 git push origin --delete
  4. 脚本实现

    Package.json 文件

    "scripts": {
    "clear:local": "bash clearBranch.sh local",
    "clear:remote": "bash clearBranch.sh remote"
    }

    clearBranch.sh 文件

    #!/bin/bash
    # 远程分支必须包含的字符,默认为jxw
    inc=$2
    include=${inc:='jxw'}
    case $1 in
    "local")
    echo '开始清除本地已经合并到master的分支(不包扩当前分支)'
    git branch --merged master | egrep -v '(^\*|master)' |xargs git branch -D
    echo '本地分支删除执行完毕'
    ;;
    "remote")
    echo '开始清除远程已经合并到master的分支'
    git remote prune origin
    echo 'git remote prune origin 删除本地远程失效分支成功'
    echo "即将删除以下远程分支"
    branch=`git branch -r --merged origin/master |egrep -v '(master|HEAD)'|grep $include|sed 's/origin\///g'`
    echo $branch
    echo '输入y删除,n或任意字符取消'
    read $REPLY
    if [ "$REPLY" == 'Y' -o "$REPLY" == 'y' ];then
    echo $branch |xargs -n 3 git push origin --delete
    echo '远程分支删除执行完毕'
    else
    echo '取消删除远程分支'
    exit 0
    fi
    ;;
    *)
    exit 0
    ;;
    esac