Как удалить удаленный тег?

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

Ответы

Ответ 1

Вам просто нужно нажать "пустую" ссылку на имя удаленного тега:

git push origin :tagname

Или, более выразительно, используйте --delete (или -d если ваша версия git старше 1.8.0):

git push --delete origin tagname

Обратите внимание, что в git есть пространство имен тегов и пространство имен веток, поэтому вы можете использовать одно и то же имя для ветки и для тега. Если вы хотите убедиться, что вы не можете случайно удалить ветку вместо тега, вы можете указать полный ref, который никогда не удалит ветку:

git push origin :refs/tags/tagname

Если вам также необходимо удалить локальный тег, используйте:

git tag --delete tagname

Фон

Передача ветки, тега или другого ссылки в удаленный репозиторий включает в себя указание "какой репозиторий, какой источник, какой пункт назначения?"

git push remote-repo source-ref:destination-ref

Пример реального мира, в котором вы перемещаете свою основную ветвь в исходную главную ветку:

git push origin refs/heads/master:refs/heads/master

Который из-за путей по умолчанию может быть сокращен до:

git push origin master:master

Теги работают одинаково:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Который также может быть сокращен до:

git push origin release-1.0:release-1.0

Опуская исходную ссылку (часть перед двоеточием), вы помещаете 'ничто' в место назначения, удаляя ссылку на удаленном конце.

Ответ 2

Более простой способ -

git push --delete origin YOUR_TAG_NAME

Синтаксис синтаксиса демона IMO в этой ситуации немного нечетный

Ответ 3

Если у вас есть удаленный тег v0.1.0 для удаления, и ваш удаленный является origin, то просто:

git push origin :refs/tags/v0.1.0

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

git tag -d v0.1.0

См. Ответ Адама Франко для объяснения необычного Git : синтаксис для удаления.

Ответ 4

Удалите все локальные теги и получите список удаленных тегов:

git tag -l | xargs git tag -d
git fetch

Удалите все удаленные теги

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

Очистить локальные теги

git tag -l | xargs git tag -d

Ответ 5

Чтобы удалить тег из удаленного репозитория:

git push --delete origin TAGNAME

Вы также можете удалить тег локально:

git tag -d TAGNAME

Ответ 6

Из вашего терминала сделайте следующее:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Теперь перейдите в Github.com и обновите, они исчезнут.

Ответ 7

Просто обратите внимание, что если у вас есть удаленная ветка, называемая удаленным тегом, эти команды неоднозначны:

git push origin :tagname
git push --delete origin tagname

Таким образом, вы должны использовать эту команду для удаления тега:

git push origin :refs/tags/<tag>

и этот для удаления ветки:

git push origin :refs/heads/<branch>

Если нет, вы получите сообщение об ошибке:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

Ответ 8

Удалить локальный тег '12345'

git tag -d 12345

Удалить удаленный тег "12345" (например, версия GitHub тоже)

git push origin :refs/tags/12345

альтернативный подход

git push --delete origin tagName
git tag -d tagName

enter image description here

Ответ 9

git tag -d your_tag_name
git push origin :refs/tags/your_tag_name

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

Ответ 10

Если вы создали тег с именем release01 в репозитории Git, вы удалили бы его из своего репозитория, выполнив следующие действия:

git tag -d release01 
git push origin :refs/tags/release01 

Чтобы удалить один из репозитория Mercurial:

hg tag --remove featurefoo

Пожалуйста, обратитесь https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

Ответ 11

Метод до 100 раз быстрее для тысяч удаленных тегов

После прочтения этих ответов, когда вам нужно удалить более 11 000 тегов, я узнал, что эти методы полагаются или xargs занимают слишком много времени, если у вас нет часов для записи.

Борясь, я нашел два гораздо более быстрых способа. Для обоих начинайте с git tag или git ls-remote --tags, чтобы создать список тегов, которые вы хотите удалить на пульте дистанционного управления. В приведенных ниже примерах вы можете опустить или заменить sorting_proccessing_etc любыми grep ing, sort ing, tail ing или head, которые вы хотите (например, grep -P "my_regex" | sort | head -n -200 и т.д.):


Этот первый метод, безусловно, самый быстрый, возможно, в 20-100 раз быстрее, чем при использовании xargs, и работает с по меньшей мере несколькими тысячами тегов за раз.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

Как это работает? Обычный, разделенный по строкам список тегов преобразуется в одну строку тегов, разделенных пробелами, каждая из которых добавляется :.,.

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

Использование git push с этим тегом формата ничего не нажимает на каждый удаленный ref, стирая его (нормальный формат для этого способа local_ref_path:remote_ref_path).

Метод второй разворачивается как отдельный ответ в другом месте на этой же странице


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

git tag | sorting_processing_etc | xargs -L 1 git tag -d

ИЛИ аналогично удаленному удалению:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

Ответ 12

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

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

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

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

Ответ 13

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

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

Ответ 14

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

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

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

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

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

Ответ 15

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

Вот метод, который в несколько раз быстрее, чем xargs и может 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

Ответ 16

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

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

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

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

Ответ 17

Кажется, что много работы для чего-то xargs уже делает. Оглядываясь назад на этот поток, я предполагаю, что медленность с xargs, которую вы испытали, заключается в том, что исходный ответ использовал xargs -n 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 аргументов в каждом процессе. Вы можете экспериментировать с аргументами, чтобы найти то, что наилучшим образом подходит для ваших нужд.

Ответ 18

Если вы используете 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 $_ }

Ответ 19

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

git tag -d #STOO2

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

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

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

Ответ 20

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

~/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

Ответ 21

Привет просто хотел поделиться псевдонимом, который я создал, который делает то же самое:

Добавьте следующее в ваш ~/.gitconfig

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

Использование выглядит так:

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)