Удалить все теги из репозитория 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чтобы удалить их с пульта.
Ионика Бизэу
7
А на винде?
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
karlingen
источник
Удаленное удаление слишком медленное для десятков тегов.
ffxsam
5
Этот ответ будет намного быстрее, если у вас много удаленных тегов: stackoverflow.com/a/34395864/747044
adriaan
Порядок команд в этом ответе предполагает отсутствие локальных тегов.
Acumenus
Это слишком медленно, ниже решение лучше.
Root Fool
Если вам нужно ввести фразу-пароль для фиксации, для каждого тега потребуется фраза-пароль. Другое решение лучше.
кап
56

Может быть более эффективно нажать удалить все теги в одной команде. Особенно, если у вас есть несколько сотен.

В подходящей оболочке не-Windows удалите все удаленные теги:

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-lines --max-lines [= max-lines] -l [max-lines] Использовать не более max-строк непустых строк ввода в командной строке. Для '-l' max-lines по умолчанию равен 1, если не указан. Для '-L' аргумент обязателен. Конечные пробелы приводят к логическому продолжению строки ввода на следующей строке ввода с целью подсчета строк. Подразумевает '-x'. Форма '-l' этой опции устарела в пользу POSIX-совместимой опции '-L'. gnu.org/software/findutils/manual/html_node/find_html/…
Ричард Квадлинг
@RichardAQuadling Хорошо, но как это повлияет на ответ? git tagвозвращает теги, по одному на строку, а затем xargs -L 1выводит их по одному на строку, так для чего это нужно?
ymett
Хммм. Казалось бы, ничего в этом контексте! Кроме того, чтобы сделать вещи немного медленнее!
Ричард Квадлинг
24

Для пользователей Windows, использующих PowerShell:

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

Это удаляет все теги, возвращаемые git tagпутем выполнения git tag -dдля каждой возвращенной строки.

Стефан Домнановиц
источник
23

Добавление к ответу Стефана, который отсутствовал, как удалить теги с удаленного. Для Windows 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)
ViZeke
источник
это не сработает, если у вас много тегов, например тысяч
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
DarkWiiPlayer
источник
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, если у вас есть много тегов upstream (origin), которые необходимо удалить:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Петр Рекдал Сунде
источник