Видаліть усі теги з сховища 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.