如何从 Github 上删除所有过时的分支?

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

我们有很多不活跃的分支(最新的有7个月了,最旧的是两年前)。
如果没有 PR 仍然开放,我想从远程批量删除所有这些分支。

我应该使用 Github 的 API 吗?我应该使用 git 使用像这个 StackOverflow 问题中提供的片段吗?
是否有一些我不熟悉的 Github 功能可以帮助组织我们的存储库?

git github github-api
6个回答
38
投票

您可以在打开陈旧分支后右键单击浏览器,然后在浏览器java脚本控制台中运行它。

删除所有过时的分支。即)此脚本自动单击下一页并继续删除下一页中的过时分支。

async function deleteStaleBranches(delay=500) {     
    var stale_branches = document.getElementsByClassName('js-branch-delete-button'); 
        for (var i = 0; i < stale_branches.length; i++)     {  
          stale_branches.item(i).click();
          await new Promise(r => setTimeout(r, delay));     
        }     
        const next = document.querySelectorAll(".pagination > a")[1];
        if(next) {         
            next.click();
            setTimeout(() => deleteStaleBranches(500), 500);
        } 
}  (() => { deleteStaleBranches(500); })();

信用:下面评论中的@LoganMurphy

仅删除当前页面中存在的陈旧分支:

async function deleteStaleBranches(delay=500) {
    var stale_branches = document.getElementsByClassName('js-branch-delete-button');
    for (var i = 0; i < stale_branches.length; i++)
    {
        stale_branches.item(i).click();
        await new Promise(r => setTimeout(r, delay));
    }
}

(() => { deleteStaleBranches(500); })();

信用:https://gist.github.com/victorlin/9c0be8f2d3305eae4d7bb8c5907a9e17


12
投票

您当然可以使用 GitHub API 来实现这一点,但您需要做一些调整才能做到这一点。

首先,使用 list pull requests API 获取开放的 Pull 请求列表。此列表中的每个项目都包含一个

["head"]["ref"]
条目,该条目将是分支的名称。

现在,使用获取所有引用 API,列出存储库中的所有引用。请注意,Git Data API 中分支的语法与拉取请求 API 返回的语法略有不同(例如

refs/heads/topic
topic
),因此您必须对此进行补偿。除非您仅搜索
refs/heads/
子命名空间,否则引用 API 也会返回标签,如文档中所述,因此请注意这一点。

一旦有了这两个分支引用列表,就可以很简单地找出哪些分支没有开放的拉取请求(不要忘记考虑

master
或您希望保留的任何其他分支!)。

此时,您可以使用 删除引用 API 从存储库中删除这些分支引用。


3
投票

我采取了与其他答案不同的策略,只是使用了好的 ol'

git
(和 bash)来完成工作:

  1. 使用
    git branch -r >~/branches.txt
    检索所有分支的列表(设置
    git config --global core.pager cat
    后)
  2. 修剪
    ~/branches.txt
    我想要保留
  3. 的那些
  4. 每人拨打
    git push <ref> --delete <branch>
    ...
for ref_branch in $(cat ~/branches.txt | head -n 5); do
    ref="$(echo "$ref_branch" | grep -Eo '^[^/]+')"
    branch="$(echo "$ref_branch" | grep -Eo '[^/]+$')"
    git push "$ref" --delete "$branch"
done

注意使用

| head -n 5
一次只能尝试 5 个。删除它,让整个东西撕裂。

这可能适用于大多数

sh
shell(zsh 等),但不适用于 Windows;抱歉。


1
投票

更安全的选项 - 删除所有merged分支:

async function deleteStaleBranches(delay=500) {
    let buttons = [];
    document.querySelectorAll(".State.State--merged").forEach((el) => {
        const butEl = el.parentElement.nextElementSibling.nextElementSibling.querySelector("button");
        buttons.push(butEl);
    });
    for (let i = 0; i < buttons.length; i++)
    {
        buttons[i].click();
        await new Promise(r => setTimeout(r, delay));
    }
}

(() => { deleteStaleBranches(500); })();

1
投票

我在控制台中使用以下命令仅删除合并和关闭的分支。

async function deleteMergedBranches(delay=500) {
    var stale_branches = document.getElementsByClassName('State--merged');
    for (var i = 0; i < stale_branches.length; i++)
    {
        stale_branches[i].parentElement.nextElementSibling.nextElementSibling.nextElementSibling.querySelector('.js-branch-delete-button').click()
        await new Promise(r => setTimeout(r, delay));
    }
}

(() => { deleteMergedBranches(500); })();
async function deleteClosedBranches(delay=500) {
    var stale_branches = document.getElementsByClassName('State--closed');
    for (var i = 0; i < stale_branches.length; i++)
    {
        stale_branches[i].parentElement.nextElementSibling.nextElementSibling.nextElementSibling.querySelector('.js-branch-delete-button').click()
        await new Promise(r => setTimeout(r, delay));
    }
}

0
投票

我创建了一个要点来展示截至 2024 年 1 月我是如何做到的 https://gist.github.com/chitalian/6220b31cf8b7dc011220e62f89f0a8e0

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