我通常不会回答已经有16个答案的问题,但是所有其他答案都是错误的,正确的答案是如此简单。问题说:“是否有一种简单的方法可以删除所有不再具有远程等效项的跟踪分支?”
如果“简单”意味着一次性删除它们,而不是脆弱,不危险,并且不依赖于并非所有读者都拥有的工具,那么正确的答案是:不会。
有些答案很简单,但它们不执行所要求的。其他人则执行要求的操作,但并不简单:它们都依赖于通过文本操作命令或脚本语言来解析Git输出,而这可能并非在每个系统上都存在。最重要的是,大多数建议都使用瓷器命令,其输出并非旨在通过脚本来解析(“瓷器”是指用于人为操作的命令;脚本应使用较低级别的“管道”命令)。
进一步阅读:
如果要安全地执行此操作,则对于问题中的用例(已在服务器上删除但仍作为本地分支存在的垃圾收集跟踪分支),仅使用高级Git命令,您必须
git fetch --prune
(或git fetch -p
,这是一个别名,或者git prune remote origin
在不进行提取的情况下执行相同的操作,并且可能在大多数情况下不是您想要的)。
- 请注意报告为已删除的所有远程分支。或者,以后再查找它们
git branch -v
(任何孤立的跟踪分支都将标记为“ [gone]”)。
git branch -d [branch_name]
在每个孤立跟踪分支上
(这是其他一些答案提出的建议)。
如果您想编写一个解决方案的脚本,那么这for-each-ref
就是您的起点,就像Mark Longair在这里的回答以及对另一个问题的回答一样,但是如果不编写Shell脚本循环或使用xargs或其他方法,我将无法找到一种利用它的方法。 。
背景说明
要了解正在发生的事情,您需要了解,在跟踪分支的情况下,您没有一个分支,但是只有三个分支。(回想一下,“分支”仅表示指向提交的指针。)
给定一个跟踪分支feature/X
,远程存储库(服务器)将拥有此分支并调用它feature/X
。您的本地存储库有一个分支remotes/origin/feature/X
,这意味着:“这是遥控器上次告诉我的,它告诉我它的功能/ X分支是”。最后,本地存储库有一个分支feature/X
,指向您的最新提交,并配置为“ track” remotes/origin/feature/X
,这意味着您可以拉动并保持对齐。
在某些时候,有人删除feature/X
了遥控器上的。从那一刻起,您就剩下了本地的feature/X
(您可能不再想要,因为功能X的工作大概已经完成了),而您的本地remotes/origin/feature/X
毫无用处,因为它的唯一目的是记住服务器分支的状态。
而且Git会让您自动清理冗余remotes/origin/feature/X
-就是git fetch --prune
这样-但由于某种原因,它不允许您自动删除自己的副本feature/X
...即使您feature/X
仍然包含孤立的跟踪信息,因此它也具有该信息以确定以前已完全合并的跟踪分支。(毕竟,它可以为您提供使您可以自己进行操作的信息。)
* master
我的系统上。以下命令为我工作:git branch -d $(git branch --merged |tail -n +2)