我遵循一个开发过程,即为每个新功能或故事卡创建一个新的本地分支。完成后,我合并到主分支,然后推。

随着时间的推移,由于懒惰或健忘,我最终会得到一个很大的本地分支列表,其中一些(如spike)可能还没有合并。

我知道如何列出我所有的本地分支,我知道如何删除一个分支,但我想知道是否有一个git命令,允许我删除我所有的本地分支?

下面是git分支——merged命令的输出。

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

所有尝试删除grep -v \*列出的分支(根据下面的答案)都会导致错误:

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

我用的是:

git 1.7.4.1  
ubuntu 10.04  
GNU bash, version 4.1.5(1)-release  
GNU grep 2.5.4  

当前回答

Git分支-d[分支名称]用于本地删除

git branch -D[分支名称]也用于本地删除,但会强制删除

其他回答

我在github上关于这个问题的评论中找到了一个更好的方法:

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

编辑:添加无颜色选项和排除稳定分支(根据您的情况添加其他分支)

如果你不需要使用Git本身,你也可以手动或编程地删除. Git /refs/heads下的头。以下应该在Bash下进行最小的调整:

shopt -s extglob
rm -rf .git/refs/heads/!(master)

这将删除除主分支外的所有本地分支。由于上游分支存储在.git/refs/remotes下,因此它们将保持不变。

如果你不使用Bash,或者想一次递归很多Git存储库,你可以用GNU find做类似的事情:

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

find解决方案可能更容易移植,但是删除路径和文件名比较棘手,而且可能更容易出错。

以上答案很好。这是另一种方法,当我们在本地回购中有很多分支时,我们必须删除许多分支,除了少数位于本地机器中的分支。

第一个git分支将列出所有本地分支。

运行unix命令将一列分支名称转换为文件中的单行 Git分支> sample.txt 这将保存在sample.txt文件中。 和运行 awk 'BEGIN {ORS = " "} {print}' sample.txt 命令。这将把列转换为行,并在单行中复制分支名称列表。

然后运行git branch -D branch_name(s)。这将删除在local中列出的所有分支

如果你使用NodeJS,我写了这个命令:

npx git-clear-branch

该命令清除除master和当前分支之外的所有本地分支。

根据这里的一些答案的组合-如果你想保留远程上存在的所有分支,但删除其余的,下面的联机程序将会做到这一点:

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D