Як видалити віддалений тег?


Відповіді:


5750

Вам просто потрібно натиснути «порожнє» посилання на ім’я віддаленого тегу:

git push origin :tagname

Або, виразніше, скористайтеся --deleteопцією (або -dякщо ваша версія git старша 1.8.0):

git push --delete origin tagname

Зауважте, що git має простір імен тегів та простір імен гілок, тому ви можете використовувати те саме ім’я для гілки та тегу. Якщо ви хочете переконатися, що ви не можете випадково видалити гілку замість тегу, ви можете вказати повний посилання, який ніколи не видалить гілку:

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

Опустивши джерело ref (частина перед двокрапкою), ви натискаєте "нічого" до місця призначення, видаляючи посилання на віддаленому кінці.


187
+1, як відповісти на питання, так і пояснити загальний випадок, а також деталізувати значення непереборного синтаксису
Петро Хост

77
І на всякий випадок, коли хтось задається питанням, як видалити кілька тегів за один раз, ви просто перелічіть їх, використовуючи пробіл, наприклад git push --delete origin tag1 tag2. Те саме стосується видалення локальних тегівgit tag -d tag1 tag2
dVaffection

8
Якщо ім'я тегу стикається з назвою гілки, ви можете видалити свою гілку. Ха-ха. Дивіться другу відповідь - це більш екологічно
зуба

1
@EmmaHe A tagприєднаний лише до одного комітету . Через це назва філії не має значення.
cb2

1
Також цікаво знати, що git tag -d `git tag`видалити всі локальні теги. Те саме стосується git push --delete origin `git tag`припущення, що ви витягнули локальні теги локально. Це було зручно в тестовому середовищі.
DarkFranX

382

Більш прямий спосіб

git push --delete origin YOUR_TAG_NAME

Синтаксис синтаксису товстої кишки IMO дещо дивний у цій ситуації


4
Я думаю, що це правильний спосіб ... інший синтаксис для мене більше схожий на хакі.
Луїджі Р. Віджіано

11
Так, це просто і працює. Хоча я б уточнив відповідь, вказавши, що є змінною частиною:, git push --delete origin "TAGNAME"де TAGNAME - назва оригінального тегу.
Teemu Leisti

12
Це працює. Одне додаток: Якщо у вас є гілка та тег з тим самим іменем, ви можете поставити слово tagперед назвою свого тегу, щоб переконатися, що ви отримали тег, а не гілку.
andypaxo

9
@andypaxo Що команда займає refspecs, правильний шлях буде випереджаючи тег з refs/tags/, як це: refs/tags/v2.3.1.
p3lim

На віддаленому сервері якось створено ім'я 'bad', на якому були спеціальні символи, тому я не можу синхронізувати з цим, тому просто видалив це з вашої пропозиції: git push --delete origin "service-- <default> - 151 ", не можна видалити його не з Intellij, не зі сховищем, не з sourceTree. Дякую !
Дмитро Алгазин

215

Якщо у вас є віддалений тег v0.1.0для видалення, а ваш віддалений - originпросто:

git push origin :refs/tags/v0.1.0

Якщо вам також потрібно видалити тег локально:

git tag -d v0.1.0

Див Адам Franco відповідь «s для пояснення незвичайного Git і :синтаксис для видалення.


2
це також працює з jgit. the: тег стенограми не працює з jgit
rynop

Я отримав fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Хаїм Елія

3
@ChaimEliyah у вас провідна риса, можливо, це ваша проблема
Joffrey

5
Краще відповідь, оскільки це також працює, якщо у вас є гілка і тег, який називається однаковим.
Ерік А. Брандстадмун

Просто :tagnameмає працювати для віддаленого видалення.
Acumenus

106

Видаліть усі локальні теги та отримайте список віддалених тегів :

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

2
Як видалити всі теги з локальних та віддалених репостів. Це те, що я шукав, дякую!
Хорхе Орпінель,

git fetch, видалення віддаленого, а потім очищення місцевих жителів, прекрасно працювали!
DiegoRBaquero

повільний, але найпростіший
Лусенс Фокс,

33

Щоб видалити тег із віддаленого сховища:

git push --delete origin TAGNAME

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

git tag -d TAGNAME

тож один рядок робити обидва:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken

25

Зі свого терміналу зробіть це:

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

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


3
git tag not tags
DSF

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Перший рядок видаляється your_tag_nameз місцевого репо.
  2. Другий рядок, видаляється your_tag_nameз віддаленого репо.
  3. Натисніть кнопку Відхилити чернетку у розділі випусків GitHub .

введіть тут опис зображення


2
Хоча ця команда може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення. Як відповісти
Попо

20

Видалити локальний тег "12345"

git tag -d 12345

Видалити віддалений тег "12345" (наприклад; версія GitHub також)

git push origin :refs/tags/12345

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

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

введіть тут опис зображення


15

Просто зауважте, що якщо у вас є віддалена гілка, названа як віддалений тег, ці команди неоднозначні:

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

Короткий і стислий. Це повідомлення разом із вискочив Меганчжоу як відповідь на те, чому у нас виникли проблеми, ім’я гілки та тег були ідентичними. Я видалив локальний тег і натиснув на: refs / tags і все було добре.
rwheadon

12

До 100 разів швидший метод для тисяч віддалених тегів

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

Намагаючись, я знайшов два набагато швидших способи. Для обох почніть з git tagабо git ls-remote --tagsскладіть список тегів, які потрібно видалити на пульті. У прикладах нижче ви можете опустити або замінити sorting_proccessing_etcбудь-який grepING, sortING, tailІНГ або 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цього тега формату нічого не натискає на кожен віддалений список, стираючи його (звичайний формат для такого натискання є 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 " ")

Ви повинні розділити це на кілька різних відповідей. Відповідь з декількома тегами в одному рядку, без сумніву, є правильною відповіддю для масового видалення тегів. Насправді знайти цю інформацію майже де-небудь ще важко. Навіть знаючи, що я шукаю, мені важко знайти його на сторінці допомоги git :) Тож кудо вам і підкресліть це як правильну відповідь, і перемістіть API GitHub в інше місце. І нарешті, видалення тегів локально, масово, працює з обмеженими місцями тегами (позбудьтеся від
колонок

Дякуємо за похвалу та пропозиції. Я це розділю. Я не розумію ваш коментар щодо видалення локального тегу. Я не думаю, що в моєму фінальному фрагменті команди не використовуються жодні колонки, але я на мобільному, тому, можливо, щось не вистачає.
TonyH

Вибачте, я просто мав на увазі, що те, що ви робите для видалення віддалених тегів, працює зі видаленням локальних тегів, забезпечуючи одразу весь список. :) Просто замість git push origin: tag1: tag2 і т. Д., Ви б зробили git tag - видалити tag1 tag2 tag3, таким чином ви зможете провести повне очищення. Знову, дякую тонну!
CubanX

11

Якщо ви використовуєте SourceTree - чудовий графічний інтерфейс Git - ви можете це легко зробити без командного рядка, виконавши наступне:

  1. Відкрийте свій сховище в SourceTree
  2. Виберіть і розгорніть вкладку «Теги» зліва
  3. Клацніть правою кнопкою миші на тег, який ви хочете видалити
  4. Виберіть "Видалити YOUR_TAG_NAME"
  5. У вікні підтвердження виберіть "Видалити тег із віддалених"

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

Крім того, якщо ви видалили тег локально, але не з віддаленого джерела, і ви хочете видалити його скрізь, тоді просто створіть новий тег, який має те саме ім’я та додається в той самий комікс, що і джерела. Потім повторіть описані вище кроки, щоб видалити всюди.


Працює як шарм. Дякую!
Native_Mobile_Arch_Dev


7

Якщо ви використовуєте 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 $_ }

Це був гладкий і хороший приклад regexp. Дякую добрий пане
Юнус

7

Як запропонував @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 / год.


Після цього ви, ймовірно, захочете також видалити свої локальні теги. Це набагато швидше, тому ми можемо повернутися до використання xargsі git tag -d, що достатньо.

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

Це здається набагато складнішим, ніж прийнята відповідь. Яка користь?
theUtherSide

2
Якщо вам потрібно видалити кілька тисяч тегів, то швидкість в 10-100 разів швидша
TonyH

Дякую за уточнення. ОП запитала про видалення єдиного тегу. Я не міг уявити, чому хтось використовуватиме такий підхід для одного тегу. Можливо, ця відповідь краща для іншого питання, пов’язаного із видаленням багатьох тегів
theUtherSide

Я не думаю, що вона існує. Я міг би створити це, щоб відповісти собі. Ви хочете вважати, що це підходить?
TonyH

1
Я згоден! Я думаю, що тут насправді досить поширена практика.
theUtherSide

6

Інші відповіді вказують, як цього досягти, але слід пам’ятати про наслідки, оскільки це віддалене сховище.

Сторінка man git tag у розділі On Retagging має гарне пояснення того, як ввічливо повідомити інших користувачів віддаленого репо про зміни. Вони навіть дають зручний шаблон оголошення для повідомлення про те, як інші повинні отримати ваші зміни.


6

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

Видалити всі віддалені теги та виключити вираз із видалення

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

Простий скрипт для видалення заданого тегу з локальних та вихідних місць. З перевіркою, чи тег дійсно існує.

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 ваш файл сценарію, щоб зробити його виконуваним.
  • Зробити сценарій глобально доступним
  • компакт-диск до вашого git-проекту
  • Сценарій виклику (наприклад,
    $> git-tag-purge.sh tag_name
    )

4

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


Цікаво. Ви щодня дізнаєтесь щось нове про команду Unix. Мені потрібно перевірити свій випадок використання з цією альтернативою.
TonyH

4

Якщо у вас створений тег, починаючи з символу # , наприклад #ST002, ви можете виявити, що u не вдається видалити, використовуючи звичайні шаблони. тобто

git tag -d #STOO2

Чи не видалити тег, але оточивши його в строковий літерал , як так

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

Це видалить його. Сподіваючись, що це допоможе тому, хто помилився, використовуючи # для написання імен тегів.


2

Ось місцева тестова шафа, щоб перевірити її локально, не возившись з пультом:

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

1

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

Додайте наступне до своєї ~ / .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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.