我们有很多不活跃的分支(最新的有7个月了,最旧的是两年前)。
如果没有 PR 仍然开放,我想从远程批量删除所有这些分支。
我应该使用 Github 的 API 吗?我应该使用 git 使用像这个 StackOverflow 问题中提供的片段吗?
是否有一些我不熟悉的 Github 功能可以帮助组织我们的存储库?
您可以在打开陈旧分支后右键单击浏览器,然后在浏览器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
您当然可以使用 GitHub API 来实现这一点,但您需要做一些调整才能做到这一点。
首先,使用 list pull requests API 获取开放的 Pull 请求列表。此列表中的每个项目都包含一个
["head"]["ref"]
条目,该条目将是分支的名称。
现在,使用获取所有引用 API,列出存储库中的所有引用。请注意,Git Data API 中分支的语法与拉取请求 API 返回的语法略有不同(例如
refs/heads/topic
与 topic
),因此您必须对此进行补偿。除非您仅搜索 refs/heads/
子命名空间,否则引用 API 也会返回标签,如文档中所述,因此请注意这一点。
一旦有了这两个分支引用列表,就可以很简单地找出哪些分支没有开放的拉取请求(不要忘记考虑
master
或您希望保留的任何其他分支!)。
此时,您可以使用 删除引用 API 从存储库中删除这些分支引用。
我采取了与其他答案不同的策略,只是使用了好的 ol'
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
一次只能尝试 5 个。删除它,让整个东西撕裂。
这可能适用于大多数
sh
shell(zsh 等),但不适用于 Windows;抱歉。
更安全的选项 - 删除所有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); })();
我在控制台中使用以下命令仅删除合并和关闭的分支。
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));
}
}
我创建了一个要点来展示截至 2024 年 1 月我是如何做到的 https://gist.github.com/chitalian/6220b31cf8b7dc011220e62f89f0a8e0