Как почистить репозиторий: удаляем лишние git-теги с подстраховкой

Обновлено:

Со временем в репозитории накапливаются теги: старые feature-ветки, неудачные эксперименты, дубликаты. Они мешают ориентироваться, забивают вывод git tag -l и могут путать в CI/CD. Покажу, как аккуратно удалить теги, которые не относятся к ветке origin/develop, — с бэкапами и возможностью отката.

Шаг 1. Создаём «страховку»

Сохраняем исходный список тегов:

git tag -l > tags-before.txt

Теперь у вас есть точка восстановления.

Шаг 2. Находим кандидатов на удаление

Выполняем скрипт, который отберёт теги вне истории origin/develop:

git tag -l | while read tag; do
  commit=$(git rev-parse "$tag^{commit}" 2>/dev/null)
  if [ -n "$commit" ]; then
    if ! git merge-base --is-ancestor "$commit" origin/develop 2>/dev/null; then
      echo "$tag"
    fi
  fi
done > tags-to-delete.txt

Можно заменить origin/develop на любую другую ветку (например, main).

Шаг 3. Проверяем список

Выводим теги, которые система хочет удалить:

cat tags-to-delete.txt

Обязательно проверьте: нет ли среди них важных (например, тегов релизов).

Шаг 4. Удаляем теги

Вариант А (аккуратно, по одному):

git tag -d имя_тега
git push origin --delete имя_тега

Вариант Б (массово, если уверены):

xargs -L1 git tag -d < tags-to-delete.txt
xargs -L1 git push origin --delete < tags-to-delete.txt

Удаление на удалённом репозитории — необратимо. Убедитесь, что теги не используются в CI/CD или документации.

Шаг 5. Проверяем результат

Синхронизируем данные и сохраняем финальный список:

git fetch --prune --prune-tags
git tag -l > tags-after.txt

Сравните tags-before.txt и tags-after.txt — всё должно сойтись.

Что делать, если ошибся?

Если случайно удалили нужный тег:

  1. Найдите хеш коммита (из tags-before.txt или через git log).
  2. Восстановите тег:
git tag имя_тега хеш_коммита
git push origin имя_тега

Итоговые файлы

  • tags-before.txt — исходный список.
  • tags-to-delete.txt — кандидаты на удаление.
  • tags-after.txt — финальный список.

А вы часто чистите теги в своих репозиториях?