Как удалить тег 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
Ответ 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 - вы можете легко сделать это без командной строки, выполнив следующие действия:
- Откройте свой репозиторий в SourceTree
- Выберите и разверните вкладку "Теги" слева
- Щелкните правой кнопкой мыши на теге, который вы хотите удалить
- Выберите "Удалить YOUR_TAG_NAME"
- В окне подтверждения выберите "Удалить тег из удаленного"
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)