![](/img/trans.png)
[英]How do I automatically delete all the github generated patch branches from a fork
[英]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/topic
与topic
),因此您必须对此进行补偿。 除非您只搜索refs/heads/
子命名空间,否则引用 API 也会返回标签,如文档中所述,因此请注意这一点。
一旦你有了这两个分支引用列表,就很容易确定哪些分支没有打开的拉取请求(不要忘记考虑master
或您希望保留的任何其他分支!)。
此时,您可以使用删除引用 API从存储库中删除这些分支引用。
我对其他答案采取了不同的策略,只是使用了好的git
(和 bash)来完成这项工作:
git branch -r >~/branches.txt
检索所有分支的列表(在设置git config --global core.pager cat
之后)~/branches.txt
我想保留的那些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.