使用git remote prune origin,我可以删除不再位于远程服务器上的本地分支。
但我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会更好)。
我该怎么做呢?
发布于 2013-06-11 01:54:01
修剪后,您可以使用git branch -r获得远程分支的列表。可以使用git branch -vv检索分支及其远程跟踪分支的列表。因此,使用这两个列表,您可以找到不在远程列表中的远程跟踪分支。
下面这行代码应该可以解决这个问题(需要bash或zsh,不适用于标准的Bourne shell):
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的分支),然后获得该输出的第一列,即分支名称。最后将所有分支名称传递给删除分支命令。
因为它使用-d选项,所以当您运行此命令时,它不会删除尚未合并到您所在分支中的分支。
还要记住,您需要首先运行git fetch --prune,否则git branch -r仍然会看到远程分支。
发布于 2013-06-04 06:17:56
如果您想删除已经合并到master中的所有本地分支,可以使用以下命令:
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d如果使用main作为主分支,则应相应地修改命令:
git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -dMore info。
发布于 2013-06-11 01:31:17
在git help fetch提供的信息中,有一小条:
-p, --prune
After fetching, remove any remote-tracking branches which no longer exist on the remote.所以,也许git fetch -p就是您要找的东西?
编辑:好的,对于那些在三年后仍在争论这个答案的人,这里有一些关于我为什么提出这个答案的更多信息……
首先,OP说他们想要“删除那些从远程分支创建的本地分支,这些分支不再在远程上了”。这在git中是不可能的。下面是一个例子。
假设我在中央服务器上有一个存储库,它有两个分支,分别称为A和B。如果我将存储库克隆到我本地系统,我的克隆将具有名为origin/A和origin/B的本地引用(还不是实际的分支)。现在假设我执行以下操作:
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>这里的相关事实是,由于某种原因,我选择在我的本地存储库上创建一个名称与其原始存储库不同的分支,并且我还有一个在原始存储库上不存在的本地分支。
现在,假设我删除了远程存储库上的A和B分支,并更新了本地存储库(某种形式的git fetch),这会导致本地引用origin/A和origin/B消失。现在,我的本地存储库仍然有三个分支:A、Z和C。其中没有一个在远程存储库上有相应的分支。其中有两个是“从……远程分支创建的”,但是即使我知道在源上曾经有一个名为B的分支,我也无法知道Z是从B创建的,因为它在这个过程中被重命名了,这可能是有充分的理由的。因此,实际上,如果没有记录分支来源元数据的外部进程,或者没有知道历史的人,就不可能知道这三个分支中的哪个分支(如果有的话)的目标是删除。如果没有一些git不会自动为您维护的外部信息,git fetch -p就是您能得到的最接近的信息,任何尝试OP要求的内容的自动方法都有可能删除太多的分支,或者丢失一些OP原本想要删除的分支。
还有其他的场景,比如我在origin/A上创建了三个独立的分支来测试三种不同的方法,然后origin/A就消失了。现在我有三个分支,它们显然不能完全匹配名称,但它们是从origin/A创建的,因此从字面上解释操作问题需要删除所有这三个分支。然而,这可能并不可取,如果你甚至可以找到一种可靠的方法来匹配它们...
https://stackoverflow.com/questions/13064613
复制相似问题