删除Github上不再存在的所有分支

问题描述 投票:0回答:3

我在 GitHub 上有分支 Branch-Master、Branch-A、Branch-B、Branch-C。我通常合并到master并删除合并的分支。这会在我的本地计算机上留下一堆分支,但不会在 GitHub 上留下。

如何自动删除我的本地分支?我想创建一个 git hook 来执行此操作。

当我尝试时

git remote prune origin

然后运行 gitbranch,我仍然可以看到我的所有分支,甚至是合并并删除到 master 中的分支。

我知道我能做到

git branch -d {the_local_branch}

手动,但这在执行 githook 或我有多个分支需要系统删除时没有帮助。

我不喜欢这里给出的答案: 如何删除所有已经合并的Git分支?

它们是基于名称并推断已删除的分支,而不是以某种方式显式传递特定于该分支的分支 ID。我在提供的链接中了解到的是,如果我创建一个与已删除分支相同的分支名称,它也将被删除,即使它们是不同的分支。

如何本地和远程删除 Git 分支?

没有解决我的询问,因为上面已经说明了解决方案。

我宁愿使用某种类型的比较函数,使用分支 uid(如果存在)。

git github
3个回答
1
投票

正如 phd 在评论中指出的那样,分支没有底层 ID。分支名称只是 your 存储库中的一个 local 名称,由您或根据您的请求创建,用于标识一个特定提交。您可以随时将此名称更改为您喜欢的任何字符串,只要它满足分支名称的要求即可。 Git 不会记得它曾经有过其他名称。

现在,有一些额外的信息:您的

.git/config
文件可以并且通常会在每个分支中包含一些注释,例如:

[branch "master"]
    remote = origin
    merge = master

[branch "develop"]
    remote = another-remote
    merge = develop

这些设置定义了分支的上游设置。分支可以根本没有上游(在这种情况下,两个设置不存在)或一个上游(在这种情况下,两个设置存在并描述上游),使用之前处理此问题的旧历史方法中的两个部分发明了远程跟踪名称。

如果您使用标准 Git 命令重命名分支,这些配置部分将自动重命名。例如,在

git branch -m develop xyz
之后,您将有:

[branch "xyz"]
    remote = another-remote
    merge = develop

这意味着您本地分支

xyz
的上游是
another-remote/develop
。 (这假设远程
fetch =
使用标准
another-remote
设置。)

通过一些努力,可以通读每个分支的上游设置(如果有):使用

git for-each-ref
枚举所有分支,然后,对于每个分支,使用
git rev-parse --symbolic-full-name <branch>@{upstream}
查看它是否有上游,如果是,上游名称是什么。请注意,这里必须要小心一点,因为“远程”可以设置为
.
,表示某个本地分支的上游是另一个本地分支。

将这种编程测试(“分支 X 是否有上游,如果有,它实际上是一个远程跟踪名称吗?它是什么远程跟踪名称?”)与第二个测试(“使用git remote <remote> prune

git fetch <remote> --prune
,远程跟踪名称是否存在?”)可能会得到你想要的。您需要进行一些编码(例如 bash 脚本)。使其达到最佳状态,或者在钩子内工作,是很困难的,但总体任务非常简单:

git for-each-ref --format='%(refname:short)' refs/heads | while read branch; do # make sure it has an upstream set -- if not, ignore upstream=$(git rev-parse --symbolic-full-name ${branch}@{upstream}) || continue # make sure the upstream is a remote-tracking name case $upstream in refs/remotes/*) ;; *) continue;; esac # get the name of the remote remote=${upstream#refs/remotes/} remote=${remote%%/*} # prune remote-tracking branches git remote $remote prune # and test whether the upstream still exists git rev-parse $upstream && continue # $branch has upstream $upstream which is gone, so: echo git branch -D $branch done

这还没有经过测试,并且缺少重要的部分,例如对它不会删除的分支保持安静(每个
rev-parse

都会向标准输出和/或标准错误发送消息)。它实际上也不会删除任何分支:因为这可能是相当不可恢复的,所以人们会想先彻底测试它,然后才删除echo

    
您可以通过一个命令一次性删除所有分支(除了已签出的分支):


0
投票

如果你想指定一些模式来匹配分支名称,你也可以这样做:

git branch --list k* | xargs git branch -D

并在

的帮助下
git remote prune origin

您可以删除系统中不再引用的远程分支。

希望这有帮助!

解决办法是先列出所有没有上游的分支,然后删除它们。


0
投票

LANG=en git branch --format='%(if:equals=gone)%(upstream:track,nobracket)%(then)%(refname:short)%(end)' | grep '.' | xargs git branch -D

此命令使用

git branch -D
 组合了 
here

xargs 给出的解决方案。

    

© www.soinside.com 2019 - 2024. All rights reserved.