В долгосрочных проектах накапливаются устаревшие задачи: баги для старых версий, фичи, которые уже не актуальны, тестовые тикеты. Ручное удаление - долго и скучно. Этот скрипт автоматически находит и удаляет (или помечает) старые задачи по заданным меткам.
💡 Скрипт использует dry-run по умолчанию - сначала покажет, что будет удалено, без реального удаления.
📦 Скрипт: delete-issues.sh Полный код #!/bin/bash # Удаление старых GitHub Issues по меткам и дате # Использование: ./delete-issues.sh [--execute] set -euo pipefail # === НАСТРОЙКИ === REPO="owner/repo" # Репозиторий в формате owner/repo LABELS='label1,label2,label3' # Метки для фильтрации (через запятую) CUTOFF="2025-12-31T23:59:59Z" # Удалять задачи, созданные ДО этой даты DRY_RUN=true # true = только показать, false = реально удалить # Парсинг аргументов if [[ "${1:-}" == "--execute" ]]; then DRY_RUN=false echo "⚠️ Режим: РЕАЛЬНОЕ УДАЛЕНИЕ" else echo "ℹ️ Режим: DRY RUN (ничего не будет удалено)" fi echo "🔍 Поиск задач в $REPO с метками: $LABELS, созданных до $CUTOFF" echo "---" # Получение и фильтрация задач gh issue list --repo "$REPO" --state all --limit 1000 \ --json number,title,createdAt,labels,url | \ jq -r --arg labels "$LABELS" --arg cutoff "$CUTOFF" ' ($labels | split(",")) as $label_array | .[] | select(.createdAt < $cutoff) | select(.labels | map(.name) | any(. as $l | $label_array | index($l))) | "\(.number)|\(.title)|\(.url)" ' | \ while IFS='|' read -r number title url; do if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY RUN] ##$number - $title" echo " $url" else echo "🗑 Удаление ##$number - $title" gh issue delete "$REPO" "$number" --yes sleep 1 # Небольшая пауза, чтобы не превысить rate limit fi done echo "---" echo "✅ Готово" Установка зависимостей # GitHub CLI # Windows (winget): winget install GitHub.cli # Linux (Ubuntu/Debian): sudo apt install gh # macOS (Homebrew): brew install gh # Авторизация gh auth login # jq (JSON-процессор) # Windows (winget): winget install jq.jq # Linux: sudo apt install jq # macOS: brew install jq Запуск # Сделать скрипт исполняемым chmod +x delete-issues.sh # DRY RUN (безопасный режим - только показать) ./delete-issues.sh # РЕАЛЬНОЕ УДАЛЕНИЕ (добавить флаг --execute) ./delete-issues.sh --execute 🔍 Как это работает Пошаговый разбор Шаг Команда Что делает 1 gh issue list --json ... Получает задачи в формате JSON с полями: номер, заголовок, дата, метки, ссылка 2 jq -r ... Фильтрует: дата < cutoff И есть хотя бы одна из указанных меток 3 while read ... Обрабатывает каждую найденную задачу 4 gh issue delete Удаляет задачу (только если DRY_RUN=false) Логика jq-фильтра ($labels | split(",")) as $label_array | # Разбиваем строку меток в массив .[] | # Для каждой задачи select(.createdAt < $cutoff) | # Только если создана до cutoff select( .labels | map(.name) | # Получаем список имён меток any(. as $l | $label_array | index($l)) # Есть ли совпадение с нашими метками ) | "\(.number)|\(.title)|\(.url)" # Форматируем вывод Почему так:
...