使用git远程修剪原点,我可以删除不在远程上的本地分支。

但是我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。

我该怎么做呢?


当前回答

这个命令和下面的脚本可以在Linux和Windows中使用Git Bash (MinGW)。

最好使用git的内部命令,这样注释或名称就不会意外地匹配并删除您不想删除的分支。git for-each-ref的格式选项可以使用许多内部“原子”来输出所需的信息。这样,我们就不必依赖管道连接到awk或grep来检查输出中的正则表达式,因为它可能包含不必要的信息。

下面的命令只使用git for-each-ref的内部低级命令来列出孤立的本地分支。一旦你有了这些,你可以管道到git分支-D。此外,别忘了先修剪和获取远程引用,否则它将找不到任何匹配:

git fetch -p
git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**' | xargs -r git branch -D

以下是分类:

Git fetch -p -删除已删除的引用,并从远程获取新的引用

Git for-each-ref——format -列出使用特定输出格式的所有引用。

%(if: = =[gone])%(upstream:track) -仅在上游跟踪分支“[gone]”时输出。

%(then)%(refname:short)%(end) -输出分支名称(当跟踪消失时)。

Refs /heads/** -限制头部引用(为了提高效率)。

| xargs -r git分支- d管道输出作为参数删除。-r表示忽略空白输入。


就其本身而言,这个解很长,很难输入,也很难记住。幸运的是,向git添加自定义命令很容易。下面的脚本使用了上面的相同命令,但是它允许用户使用——dry-run选项查看将选择哪些分支。

我将我的文件命名为git-prune-local,并将其放在包含在PATH中的文件夹中。它还需要执行权限(chmod 755 git-prune-local)。

Git自动查找可执行文件,如Git -[command]。这样,你只需要输入git prune-local来删除正确的分支。

git-prune-local

#!/bin/sh

if [ $# -gt 1 ] || ([ ! -z $1 ] && [ $1 != "--dry-run" ])
then
    echo "Usage: git prune-local [--dry-run]"
    exit
fi

git fetch -p --quiet
branchesToDelete=$(git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**')

while read -r branch
do
    if [ ! -z $branch ]
    then
        if [ ! -z $1 ]
        then
            echo $branch
        else
            git branch -D $branch
        fi
    fi
done <<< "$branchesToDelete"

其他回答

删除所有没有更新到master的分支

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

如果使用Windows和Powershell,您可以使用以下命令删除已合并到当前签出的分支中的所有本地分支:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

解释

列出当前分支和已合并到其中的分支 过滤掉当前分支 清除git输出中每个剩余分支名称的前导或尾随空格 删除合并的本地分支

值得先运行git分支——自行合并,以确保它只会删除你希望它删除的东西。

(从http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/移植/自动化。)

您可以使用该命令:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git清洁:删除已经合并的分支,包括分解命令

修剪完成后,你可以使用git branch -r获取远程分支的列表。带有远程跟踪分支的分支列表可以使用git branch -vv检索。因此,使用这两个列表,您可以找到不在远程列表中的远程跟踪分支。

这一行应该做的把戏(需要bash或zsh,不会与标准的Bourne shell工作):

git fetch -p ; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

该字符串获取远程分支的列表,并通过标准输入将其传递给egrep。并过滤具有远程跟踪分支的分支(使用git branch -vv并过滤那些具有origin的分支),然后获得输出的第一列,这将是分支名称。最后将所有分支名称传递给delete branch命令。

由于它使用的是-d选项,所以在运行此命令时,它不会删除尚未合并到您所在分支中的分支。

在OS X上,支持cut -w

git branch -d $(git branch -vv | grep ': gone]' | cut -w -f 2 )

解释

删除以下分支

git branch -d ...

显示移除的分支

$ git branch -vv | grep ': gone]'
  chore/TECH-456   a4bdac8ac8 [origin/TECH-456: gone] chore: syntax error
  feature/TECH-678 0342f8e277 [origin/feature/TECH-678: gone] Added IsGross in new Income Details

保留分支名称

$ git branch -vv | grep ': gone]' | cut -w -f 2
chore/TECH-456
feature/TECH-678