Как удалить удаленный тег? - PullRequest
2848 голосов
/ 30 марта 2011

Как удалить тег Git, который уже был добавлен?

Ответы [ 21 ]

6 голосов
/ 27 октября 2018

Если вы используете SourceTree - отличный графический интерфейс Git - тогда вы можете легко сделать это без командной строки, выполнив следующие действия:

  1. Откройте свой репозиторий в SourceTree
  2. Выберите иразверните вкладку «Теги» слева
  3. Щелкните правой кнопкой мыши по тегу, который хотите удалить
  4. Выберите «Удалить YOUR_TAG_NAME»
  5. В окне подтверждения выберите «Удалить тег»Из Remotes "

YOUR_TAG_NAME теперь будет удалено из вашего локального хранилища и всех удаленных устройств - будь то GitHub, BitBucket или где-либо еще, что вы указали в качестве удаленного для этого хранилища.

Также, если вы удалили тег локально, но не в удаленных источниках, и хотите удалить его везде, просто создайте новый тег с тем же именем и прикрепленный к тому же коммиту, что и источники.Затем повторите шаги, описанные выше, чтобы удалить их везде.

6 голосов
/ 04 марта 2013

Другие ответы указывают, как этого добиться, но вы должны помнить о последствиях, поскольку это удаленное хранилище.

Страница man тега git в разделе On Retagging содержит хорошее объяснение того, как вежливо проинформировать других пользователей удаленного репо об изменении. Они даже предоставляют удобный шаблон объявления, чтобы сообщить, как другие должны получить ваши изменения.

5 голосов
/ 26 сентября 2017

Я хотел удалить все теги, кроме тех, которые соответствуют шаблону, чтобы я мог удалить все, кроме последних двух месяцев производственных тегов, вот что я использовал с большим успехом:

УдалитьВсе удаленные теги и исключить выражение из удаления

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Удалить все локальные теги и исключить выражение из удаления

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
5 голосов
/ 08 сентября 2017

Как и предположил @CubanX, я отделил этот ответ от моего оригинала:

Вот метод, который в несколько раз быстрее, чем xargs, и может измениться гораздо больше при настройке. Он использует Github API , токен личного доступа, и использует утилиту parallel.

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallel имеет много режимов работы, но, как правило, распараллеливает любую команду, которую вы ей даете, позволяя вам устанавливать ограничения на количество процессов. Вы можете изменить параметр --jobs 2, чтобы разрешить более быструю работу, но у меня были проблемы с ограничениями скорости Github , которые в настоящее время составляют 5000 / час, но также имеют недокументированный краткосрочный лимит.


После этого вы, вероятно, захотите удалить свои локальные теги. Это намного быстрее, поэтому мы можем вернуться к использованию xargs и git tag -d, что достаточно.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
4 голосов
/ 05 июня 2017

Похоже, что много работы для чего-то, что xargs уже делает. Оглядываясь назад в этой ветке, я предполагаю, что медлительность с xargs, которую вы испытали, заключается в том, что первоначальный ответ использовал xargs -n 1, когда это действительно не нужно.

Это эквивалентно вашему методу 1, за исключением того, что xargs автоматически обрабатывает максимальную длину командной строки:

git tag | sorting_processing_etc | xargs git push --delete origin

xargs также может запускать процессы параллельно. Способ 2 с xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

Выше используется максимум 5 процессов для обработки максимум 100 аргументов в каждом процессе. Вы можете поэкспериментировать с аргументами, чтобы найти то, что лучше всего подходит для ваших нужд.

4 голосов
/ 13 мая 2019
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name

Первая строка удаляет your_tag_name из локального репо, а вторая удаляет его из удаленного репо. Теперь your_tag полностью удален, как из локального, так и из удаленного репозитория, но иногда вам может понадобиться удалить удаленный тег, который был создан GitHub вручную в разделе вашего релиза.

4 голосов
/ 25 апреля 2017

Простой скрипт для удаления данного тега из локального и исходного местоположений.С проверкой, если тег действительно существует.

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

Как использовать:

  • Создание файла сценария оболочки (например, git-tag-purge.sh) и вставка содержимого.
  • chmod ваш файл скрипта, чтобы сделать его исполняемым.
  • Сделать скрипт глобально доступным
  • cd для вашего git проекта
  • Вызов скрипта (например,
    $>git-tag-purge.sh tag_name
    )
3 голосов
/ 23 августа 2017

Если вы используете PowerShell и хотите удалить несколько из них:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Конечно, вы также можете отфильтровать их перед удалением:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
2 голосов
/ 03 мая 2018

Вот локальный тестовый пример для локального тестирования, не связываясь с пультом:

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest
2 голосов
/ 12 апреля 2018

Если у вас есть тег, созданный начиная с символа # , например, #ST002, вы можете обнаружить, что вы не можете удалить, используя обычные шаблоны. т.е.

git tag -d #STOO2

Не удалит тег, но обернет его в строковый литерал примерно так

git tag -d "#ST002" or git tag -d '#ST002'

Это удалит его. Надеясь, это поможет кому-то, кто совершил ошибку, используя # для написания имен тегов.

...