删除分支不在远程

Doz*_*zer 21 git git-branch

==> git branch -a
* master
  test
  remotes/origin/master
  remotes/origin/test
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以这样做并删除 test

==> git remote prune
==> git branch -d test
==> git branch -a
* master
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

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

小智 33

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

git branch --merged origin/master | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)

您可能需要根据您的特定配置进行调整,但管道之前的第一个命令应该为您提供已合并到主分支中的所有本地分支的列表.

  • 由于担心删除本地主人,我将其修改为:`git branch --merged origin/master | grep -v master | xargs git branch -d` (21认同)
  • Nitpicky更改为上面的注释,但为了避免除了"master"之外的其他分支(即Gitflow中的"develop"),最好不要反转grep命令,而是执行类似的操作:`git branch --merged origin/develop | grep"^\s*feature /"| xargs git branch -d` (5认同)
  • 如果你想删除除远程之外的所有内容,另一个挑剔的修正案...让我们确保我们_仅_排除“master”而不是“mastery”或“postmaster”,方法是在grep中添加“-w”:`git分支--merged origin/master | grep -vw 大师 | xargs git 分支 -d` (2认同)
  • 对于最终到达这里的 Windows 用户,我为您准备了以下版本,因为 xargs 不在那里退出。*PowerShell 风格:*`git 分支 --merged origin/main | ForEach-Object { gitbranch -d $_.Trim() }` 也可以简化为以下内容: `gitbranch --merged origin/main | % { gitbranch -d $_.Trim() }` 还有其他可能性,但我们在这里停止使用 PowerShell。*CMD 风格* `FOR /F "tokens=*" %i IN ('gitbranch --merged origin/main') DO gitbranch -d %i` (2认同)

twa*_*erg 18

根据git-fetch手册页,git fetch -p将"取出后,删除遥控器上不再存在的任何远程跟踪分支.如果您有本地分支跟踪这些远程分支,您可能需要手动修剪它们.

  • 您能否可靠地区分设置为跟踪远程分支的本地分支与用于本地开发的分支?如果我的本地分支名为`foo`,它最初是为跟踪`remotes/origin/foo`创建的,还是我创建的本地分支来测试一些新想法?如果你可以为每个本地分支可靠地回答这个问题,你可以`git branch -D`你不想要的那些.如果你不能,那么"自动"尝试这样做将具有破坏性. (6认同)
  • 但是如何删除不在远程的本地分支?`-p`只删除远程跟踪 (5认同)
  • [手册](https://git-scm.com/docs/git-fetch#Documentation/git-fetch.txt--p) 说 `--prune` 将 _"删除任何不存在的远程跟踪引用不再存在于遥控器上”_。因此,不跟踪远程分支的本地分支不会受到影响。 (2认同)

kcm*_*kcm 10

简单的剪枝不会删除本地分支.

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

git branch -vv | grep ': gone]'|  grep -v "\*" | awk '{ print $1; }' | xargs -r git branch -d
Run Code Online (Sandbox Code Playgroud)

这将检查所有本地分支及其来源,并将删除其原始删除的所有本地分支.

详细地:

git branch -vv
Run Code Online (Sandbox Code Playgroud)

将列出您的本地分支并显示有关远程分支的信息,如果它不再存在则说"已消失".

grep ': gone]'
Run Code Online (Sandbox Code Playgroud)

将获取与"gone"短语匹配的分支.

grep -v "\*"
Run Code Online (Sandbox Code Playgroud)

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

awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

xargs git branch -d
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢向“xargs”抛出一个“-p”参数(特别是如果您对“git分支”使用“-D”选项),以便对每个运行的命令进行明确的确认。为此,请使用“xargs -rp gitbranch -D”修改最后一个命令 (2认同)

Kar*_*bur 10

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

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

这是一个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'
Run Code Online (Sandbox Code Playgroud)

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


tru*_*tin 5

为此,我编写了一个简单的 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"
Run Code Online (Sandbox Code Playgroud)

  • 这就是我想要的答案。我有兴趣清除 github 中不存在的同名本地分支。其他答案删除远程跟踪分支,并删除所有合并的分支,但这不是我想要的。所以谢谢你。我在运行之前将 -D 更改为 -d ,以防万一。 (2认同)

You*_*ode 5

快速地

git fetch -p
git branch -v | grep "\[gone\]"
Run Code Online (Sandbox Code Playgroud)

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


详细的

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

git fetch -p
Run Code Online (Sandbox Code Playgroud)

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

git branch -v
Run Code Online (Sandbox Code Playgroud)

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

要获得简洁的列表,请运行

git branch -v | grep "\[gone\]"
Run Code Online (Sandbox Code Playgroud)


Lak*_*gha 0

您可以通过迭代引用来完成此操作,我使用以下命令删除了所有没有远程分支的本地分支,并且它有效。警告:此操作会强制删除未完全合并的分支,请小心使用。

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

%(fieldName) = refname:short)

refs/heads/如果分支名称中有共同的前缀/后缀,则可以添加 = 后缀,例如:refs/heads/*abc*

有关更多信息,请参阅git-for-each-ref(1) 手册页