Як ви видалите тег Git, який уже натиснули?
Як ви видалите тег Git, який уже натиснули?
Відповіді:
Вам просто потрібно натиснути «порожнє» посилання на ім’я віддаленого тегу:
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 (частина перед двокрапкою), ви натискаєте "нічого" до місця призначення, видаляючи посилання на віддаленому кінці.
git push --delete origin tag1 tag2
. Те саме стосується видалення локальних тегівgit tag -d tag1 tag2
tag
приєднаний лише до одного комітету . Через це назва філії не має значення.
git tag -d `git tag`
видалити всі локальні теги. Те саме стосується git push --delete origin `git tag`
припущення, що ви витягнули локальні теги локально. Це було зручно в тестовому середовищі.
Більш прямий спосіб
git push --delete origin YOUR_TAG_NAME
Синтаксис синтаксису товстої кишки IMO дещо дивний у цій ситуації
git push --delete origin "TAGNAME"
де TAGNAME - назва оригінального тегу.
tag
перед назвою свого тегу, щоб переконатися, що ви отримали тег, а не гілку.
refs/tags/
, як це: refs/tags/v2.3.1
.
Якщо у вас є віддалений тег v0.1.0
для видалення, а ваш віддалений - origin
просто:
git push origin :refs/tags/v0.1.0
Якщо вам також потрібно видалити тег локально:
git tag -d v0.1.0
Див Адам Franco відповідь «s для пояснення незвичайного Git і :
синтаксис для видалення.
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?
:tagname
має працювати для віддаленого видалення.
Видаліть усі локальні теги та отримайте список віддалених тегів :
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 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 tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
з місцевого репо.your_tag_name
з віддаленого репо.git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
Просто зауважте, що якщо у вас є віддалена гілка, названа як віддалений тег, ці команди неоднозначні:
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>'
Прочитавши ці відповіді, потребуючи видалення понад 11 000 тегів, я дізнався, що ці методи покладаються або знаходяться xargs
занадто довго, якщо у вас немає годин, щоб записати.
Намагаючись, я знайшов два набагато швидших способи. Для обох почніть з git tag
або git ls-remote --tags
складіть список тегів, які потрібно видалити на пульті. У прикладах нижче ви можете опустити або замінити sorting_proccessing_etc
будь-який grep
ING, sort
ING, tail
ІНГ або head
ІНГ ви хочете ( наприклад , і grep -P "my_regex" | sort | head -n -200
т.д. ):
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 " ")
Якщо ви використовуєте SourceTree - чудовий графічний інтерфейс Git - ви можете це легко зробити без командного рядка, виконавши наступне:
YOUR_TAG_NAME тепер буде видалено з вашого локального сховища та всіх віддалених - будь то GitHub, BitBucket або деінде, яке ви вказали як віддалене для цього сховища.
Крім того, якщо ви видалили тег локально, але не з віддаленого джерела, і ви хочете видалити його скрізь, тоді просто створіть новий тег, який має те саме ім’я та додається в той самий комікс, що і джерела. Потім повторіть описані вище кроки, щоб видалити всюди.
Якщо ви створили тег, який називається 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
Якщо ви використовуєте 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 $_ }
Як запропонував @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
Інші відповіді вказують, як цього досягти, але слід пам’ятати про наслідки, оскільки це віддалене сховище.
Сторінка man git tag у розділі On Retagging має гарне пояснення того, як ввічливо повідомити інших користувачів віддаленого репо про зміни. Вони навіть дають зручний шаблон оголошення для повідомлення про те, як інші повинні отримати ваші зміни.
Я хотів видалити всі теги, за винятком тих, що відповідають шаблону, щоб я міг видалити всі, крім останніх декількох місяців виробничих тегів, ось що я використовував з великим успіхом:
Видалити всі віддалені теги та виключити вираз із видалення
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
Простий скрипт для видалення заданого тегу з локальних та вихідних місць. З перевіркою, чи тег дійсно існує.
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 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 аргументів у кожному процесі. Ви можете експериментувати з аргументами, щоб знайти те, що найкраще підходить для ваших потреб.
Якщо у вас створений тег, починаючи з символу # , наприклад #ST002
, ви можете виявити, що u не вдається видалити, використовуючи звичайні шаблони. тобто
git tag -d #STOO2
Чи не видалити тег, але оточивши його в строковий літерал , як так
git tag -d "#ST002" or git tag -d '#ST002'
Це видалить його. Сподіваючись, що це допоможе тому, хто помилився, використовуючи # для написання імен тегів.
Ось місцева тестова шафа, щоб перевірити її локально, не возившись з пультом:
~/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
Привіт просто хотів поділитися псевдонімом, який я створив, який робить те саме:
Додайте наступне до своєї ~ / .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)