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

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

18 ответов


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

git push origin :tagname

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

git push --delete origin tagname

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

git tag --delete tagname

фон

нажатие ветви, тега или другой ссылки на удаленный репозиторий включает указание " push where, what source, what пункт назначения?"

git push where-to-push source-ref:destination-ref

пример реального мира, где вы нажимаете свою главную ветвь на главную ветвь origin:

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

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


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

git push --delete origin YOUR_TAG_NAME

IMO префикс двоеточия синтаксис немного странно в этой ситуации


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

git push origin :refs/tags/v0.1.0

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

git tag -d v0.1.0

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


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

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

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

git push --delete origin TAGNAME

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

git tag -d TAGNAME

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

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

Теперь перейдите к Github.com и, освежившись, они исчезают.


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

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>'

Если вы создали тег называется 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


удалить локальный тег '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


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

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


до 100x более быстрый метод для тысяч удаленных тегов

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

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


этот первый метод, безусловно, самый быстрый, может быть от 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 " ")

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

Удалить Все Удаленные Теги И Исключить Выражение Из 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

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

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

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

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

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

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


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

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


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

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

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

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

git tag -d #STOO2

не удалит тег, но обернет его в Строковый Литерал вот так

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

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


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

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