Как удалить удаленный тег 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
другие ответы указывают, как это сделать, но вы должны иметь в виду последствия, поскольку это удаленный репозиторий.
страница руководства тега git, в Перейти На раздел, имеет хорошее объяснение того, как вежливо информировать других пользователей удаленного РЕПО об изменении. Они даже дают удобный шаблон объявления для общения, как другие должны получить ваши изменения.
до 100x более быстрый метод для тысяч удаленных тегов
после прочтения этих ответов, когда мне нужно удалить более 11 000 тегов, я узнал, что эти методы полагаются или xargs
слишком долго, если у вас нет часов, чтобы сжечь.
борясь, я нашел два много более быстрые пути. Для обоих, начните с git tag
или git ls-remote --tags
сделать список тегов, которые вы хотите удалить на удаленном. В приведенных ниже примерах вы можете опустить или заменить sorting_proccessing_etc
С grep
ing,sort
ing,tail
ing или head
ing вы хотите (например 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