Видаліть усі теги з сховища Git


224

Я хочу видалити всі теги з сховища Git. Як я можу це зробити?

Використовуючи локальне git tag -d tagnameвидалення тегу tagnameта git push --tagsоновлення тегів на постачальнику git.

Я намагався:

git tag -d *

Але я бачу, що це *означає файли з поточного каталогу.

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

Подумайте, у мене дуже багато тегів, і я хочу їх видалити всі.

Відповіді:


419
git tag | xargs git tag -d

Просто використовуйте філософію Linux, де ви все робите. У Windows використовують git bash з тією ж командою.


136
Дякую. Ця команда видаляє локальні теги. Раніше я git tag -l | xargs -n 1 git push --delete originвидаляв їх із пульта.
— Ionică Bizău

7
А на Windows?
— CodeManX

7
@CoDEmanX У Windows слід використовувати git bash з тією ж командою.
— inf3rno

2
Не видаляє віддалені теги, також дуже повільно для тисяч тегів.
— Адріан Бейкер

1
"xargs" не розпізнається як внутрішня чи зовнішня команда в Windows 10
— Gulzar

207

Щоб видалити віддалені теги (перед видаленням локальних тегів), просто:

git tag -l | xargs -n 1 git push --delete origin

а потім видаліть локальні копії:

git tag | xargs git tag -d

Віддалене видалення занадто повільне для десятків тегів.
— ffxsam

5
Ця відповідь шлях швидше , якщо у вас є багато віддалених тегів: stackoverflow.com/a/34395864/747044
— Adriaan

Порядок команд у цій відповіді припускає, що немає тегів, призначених лише для локальних даних.
— Acumenus

Це занадто повільно, нижче рішення краще.
— Root Fool

Якщо вам потрібно ввести парольну фразу для комітетів, для цього потрібна парольна фраза для кожного тегу. Інше рішення краще.
— кап

56

Може бути ефективнішим натиснути видалити всі теги в одній команді. Особливо, якщо у вас кілька сотень.

Видаліть усі віддалені теги у відповідній оболонці без вікна:

git tag | xargs -L 1 | xargs git push origin --delete

Потім видаліть усі локальні теги:

git tag | xargs -L 1 | xargs git tag --delete

Це повинно бути добре, якщо у вас немає 'імен тегів. Для цього слід виконати наступні команди.

git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete

Можливо, існують інші способи складання списку рядків, загортання їх у лапки, перетворення їх у єдиний рядок, а потім передавання цього рядка команді. Враховуючи, що це найкраща середовище для котячої шкіри та все.


3
У мене було кілька тисяч тегів, видалення їх по одному з віддаленого хмарного репо займало дні, що це і вирішило.
— Адріан Бейкер

Що робить xargs -L 1?
— ymett

-L max-рядки - max-рядки [= max-рядки] -l [max-рядки] Використовуйте щонайбільше max-рядків незаповнені рядки введення в командному рядку. Для '-l' макс-рядки за замовчуванням до 1, якщо вони відсутні. Для '-L' аргумент є обов'язковим. Зворотні пробіли спричиняють логічне продовження рядка введення на наступному рядку введення для підрахунку рядків. Позначає '-x'. Форма '-l' цього параметра застаріла на користь POS-сумісної опції -L. gnu.org/software/findutils/manual/html_node/find_html/…
— Richard A Quadling

@RichardAQuadling Добре, але який ефект це має у відповіді? git tagповертає теги, по одному на рядок, а потім xargs -L 1виводить їх по одному на рядок, так для чого це?
— ymett

Хммм. Здається, нічого в цьому контексті! Окрім того, щоб зробити речі на дотик повільніше!
— Річард А Квадлінг

24

Для користувачів Windows, що використовують PowerShell:

git tag | foreach-object -process { git tag -d $_ }

Це видаляє всі повернуті теги git tag, виконуючи виконання git tag -dкожного повернутого рядка.


23

Додавши до відповіді Стефана, в якому бракувало, як видалити теги з віддаленого. У вікні PowerShell можна запустити це для видалення віддалених тегів, а потім локальних тегів.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  

19

Якщо у вас немає місцевих тегів у локальному репо, ви можете видалити віддалені теги без необхідності переносити їх у місцеве репо.

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

Не забудьте замінити "origin" на ім'я віддаленого обробника.


Відмінно! Це видалило їх за один раз. Інша команда
— видаляла


6

Ви також можете використовувати:

git tag -d $(git tag)

це не спрацює, якщо у вас є багато тегів, як-от тисячі
— DixonD

у цьому випадку ви можете використовувати щось на кшталт: git tag -d $ (git tag | head -n 999) та виконати його x разів
— ViZeke

1

Оскільки всі ці параметри працюють лише в Linux, ось еквівалент Windows для тих, хто має справу з цим:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t

1

Я маю видалити теги з префіксом

наприклад, я повинен видалити теги v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

git tag -d $(git tag -l "v0.0.*")

Список усіх тегів з префіксом

git tag -l "v0.0.*"

Щоб видалити теги

git tag -d $tag_names

Ось так працює перша заява


Швидкий, простий та ефективний. Працювали, дякую!
— Ведран Мандич

0

Powershell v7 підтримує паралельний foreach, якщо у вас є багато тегів висхідного походження (origin), які потрібно видалити:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.