繁体   English   中英

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

[英]How do I remove all stale branches from Github?

我们有很多不活跃的分支(最新的是 7 个月大,最早的是两年前)。
如果仍然没有 PR 对它们开放,我想从遥控器中批量删除所有这些分支。

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

您可以在打开过时的分支后右键单击浏览器并在浏览器 java 脚本控制台中运行它。

对于 2022 Github 的网页:

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

对于 2021 Github 的网页:


 var stale_branches = document.getElementsByClassName('color-text-danger');
 for (var i = 0; i < stale_branches.length; i++) {
 stale_branches.item(i).click();
 }

或者正如@MartinNowak 所建议的那样

document.querySelectorAll('button[data-target="branch-filter-item.destroyButton"]').forEach(btn => btn.click())

您当然可以使用 GitHub API 来实现这一点,但您需要花点时间来完成它。

首先,使用列表拉取请求 API获取打开的拉取请求列表。 此列表中的每个项目都包含一个["head"]["ref"]条目,该条目将是一个分支的名称。

现在,使用get all references API列出存储库中的所有引用。 请注意,Git 数据 API 中的分支语法与从拉取请求 API 返回的语法略有不同(例如refs/heads/topictopic ),因此您必须对此进行补偿。 除非您只搜索refs/heads/子命名空间,否则引用 API 也会返回标签,如文档中所述,因此请注意这一点。

一旦你有了这两个分支引用列表,就很容易确定哪些分支没有打开的拉取请求(不要忘记考虑master或您希望保留的任何其他分支!)。

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

我对其他答案采取了不同的策略,只是使用了好的git (和 bash)来完成这项工作:

  1. 使用git branch -r >~/branches.txt检索所有分支的列表(在设置git config --global core.pager cat之后)
  2. 修剪~/branches.txt我想保留的那些
  3. 在每一个上调用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 | head -n 5一次只尝试 5 个。 删除它,让整个东西撕裂。

这可能适用于大多数sh shell(zsh 等),但不适用于 Windows; 对不起。

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

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); })();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM