40
==> git branch -a
* master
  test
  remotes/origin/master
  remotes/origin/test

当有人删除时remotes/origin/test,我仍然可以在我的电脑上看到它。

我知道我可以做到这一点并删除test

==> git remote prune
==> git branch -d test
==> git branch -a
* master
  remotes/origin/master

但是如果我有更多的本地分支,并且它们不在远程,那么我怎样才能快速删除它们呢?

4

8 回答 8

55

这就是我删除不再相关的本地分支的方式:

git branch --merged origin/master | xargs git branch -d

您可能需要根据您的特定配置对其进行调整(例如,请参阅下面的注释以排除特定分支),但管道之前的第一个命令应该为您提供已合并到主分支中的所有本地分支的列表。

于 2013-08-22T12:38:42.480 回答
30

简单的修剪不会删除本地分支。

这是实现真正删除的另一种方法。请务必先执行“git fetch -p”以获取远程存储库的最新状态。

git branch -vv | grep ': gone]'|  grep -v "\*" | awk '{ print $1; }' | xargs -r git branch -d

这将检查所有本地分支及其来源,并将删除其来源已被删除的所有本地分支。

详细地:

git branch -vv

将列出您的本地分支并显示有关远程分支的信息,如果它不再存在,则说“gone”。

grep ': gone]'

将获取匹配“gone]”短语的分支。

grep -v "\*"

将仅获取不包含星号的行。这将忽略您当前所在的分支,并防止“git branch -d”在末尾以“*”执行,这将导致删除所有本地分支

awk '{print $1}'

将获取输出直到第一个空格,这将导致本地分支名称。

xargs git branch -d

将使用输出(分支名称)并将其附加到“git branch -d”命令以最终删除分支。如果您还想删除未完全合并的分支,可以使用大写的“D”而不是“d”来强制删除。

于 2017-09-13T08:34:13.667 回答
26

根据git-fetch手册页,git fetch -p将“获取后,删除远程不再存在的任何远程跟踪分支。”如果您有本地分支跟踪这些远程分支,您可能需要手动修剪这些分支。

于 2013-05-16T14:41:42.347 回答
6

为此,我编写了一个简单的 shell 脚本git-dangling-branches。如果您指定-D选项,它将删除所有没有refs/remotes/origin/<branch_name>. 当然,当你这样做时,你应该小心。

#!/bin/bash -e
if [[ "$1" == '-D' ]]; then
  DELETE=1
else
  DELETE=0
fi

REMOTE_BRANCHES="`mktemp`"
LOCAL_BRANCHES="`mktemp`"
DANGLING_BRANCHES="`mktemp`"
git for-each-ref --format="%(refname)" refs/remotes/origin/ | \
  sed 's#^refs/remotes/origin/##' > "$REMOTE_BRANCHES"
git for-each-ref --format="%(refname)" refs/heads/ | \
  sed 's#^refs/heads/##' > "$LOCAL_BRANCHES"
grep -vxF -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES" | \
  sort -V > "$DANGLING_BRANCHES"
rm -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES"

if [[ $DELETE -ne 0 ]]; then
  cat "$DANGLING_BRANCHES" | while read -r B; do
    git branch -D "$B"
  done
else
  cat "$DANGLING_BRANCHES"
fi
rm -f "$DANGLING_BRANCHES"
于 2014-03-27T12:19:52.890 回答
3

我最终得到了与kcm的方法非常相似的东西。我想要一些可以清除所有跟踪远程分支的本地分支的东西,on origin,远程分支已被删除(gone)。我不想删除从未设置为跟踪远程分支的本地分支(即:我的本地开发分支)。此外,我想要一个简单的单行程序,它只使用git. 或其他简单的 CLI 工具,而不是编写自定义脚本。我最终使用了一些grepandawk来制作这个简单的命令,然后将它作为别名添加到我的~/.gitconfig.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

这是一个git config --global ...可以轻松将其添加为的命令git prune-branches

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

注意:正如Matteo在他之前对另一个答案的评论中指出的那样,使用-D标志git branch可能非常危险。因此,在配置命令中,我使用-d选项 togit branch而不是-D; 我-D在我的实际配置中使用。我使用-D是因为我不想听到 Git 抱怨未合并的分支,我只想让它们消失。您可能也需要此功能。如果是这样,只需在该配置命令的末尾使用-D而不是。-d

于 2018-02-06T18:56:09.093 回答
1

You can do this by iterating over the refs, I used following command to remove all the local branches which dont have remote branches and it worked. Warning: this operation does a force delete non fully merged branches, use with care.

git branch -D `git for-each-ref --format="%(fieldName)" refs/heads/<branch-name-pattern>`

%(fieldName) = refname:short)

refs/heads/ = can be suffixed if you have a common prefix/suffix in branch names ex: refs/heads/*abc*

Refer this for more information git-for-each-ref(1) Manual Page

于 2013-05-16T14:40:43.447 回答
1

快速地

git fetch -p
git branch -v | grep "\[gone\]"

然后手动检查并删除输出中的分支。


详细的

基于此线程以及此处的答案的最简单的手动解决方案是删除遥控器上不再存在的所有远程跟踪引用

git fetch -p

然后查看已从远程跟踪中删除的内容,但仍在您的本地工作树中

git branch -v

并手动删除[gone]输出中的分支。

获得一个简洁的列表运行

git branch -v | grep "\[gone\]"
于 2021-04-04T01:33:22.683 回答
0

首先,做:

git fetch && git remote prune origin

接着:

git branch -a | grep -v ${$(git branch -a | grep remotes | cut -d/" -f3-)/#/-e} | xargs git branch -D

  • 列出所有没有 remote/origin 前缀的遥控器:git branch -a | grep remotes | cut -d'/' -f3-
  • 从 git 中删除所有列出的内容:git branch -a | grep v ${<all remotes without prefix>/#/-e}
  • 从本地需求中删除,-D因为并非所有都必须标记为已合并。例如,Github 中的 squash 和 merge 不会将它们标记为已合并。
于 2018-12-28T09:32:07.403 回答