Cum pentru a șterge de la distanță o etichetă?

Cum poti sterge un Git tag-ul care a fost deja împinse?

Soluția

Ai nevoie doar pentru a împinge un 'gol' de referință la distanță nume de etichetă:

git push origin :tagname

Sau, mai expresiv, de a folosi --delete opțiune (sau -d dacă git versiune este mai în vârstă decât 1.8.0):

git push --delete origin tagname

Rețineți că git are etichetă de nume și de ramură namespace astfel se poate folosi acelasi nume pentru o ramură și o etichetă. Dacă doriți să vă asigurați că nu puteți elimina accidental filiala loc de tag-ul, puteți specifica complet ref care va șterge niciodată o sucursală:

git push origin :refs/tags/tagname

Dacă ai nevoie, de asemenea, să ștergeți locale, tagul, utilizare:

git tag --delete tagname

De fundal

Împingând-o ramură, tag-ul, sau alte ref la un depozit la distanță implică specificarea "care repo, ce sursa, ce destinație?"

git push remote-repo source-ref:destination-ref

Un exemplu real în cazul în care împinge stăpânul tău ramură de origine's ramura master este:

git push origin refs/heads/master:refs/heads/master

Care, din cauza căi implicit, poate fi redus la:

git push origin master:master

Tag-uri funcționează în același mod:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Care poate fi, de asemenea, redus la:

git push origin release-1.0:release-1.0

Prin omiterea sursa ref (o parte înainte de a colonului), te împinge 'nimic' la destinație, ștergerea ref la capătul îndepărtat.

Comentarii (9)

O modalitate mai directă este

git push --delete origin YOUR_TAG_NAME

OMI prefixarea colon sintaxa este un pic ciudat în această situație

Comentarii (5)

Dacă aveți o telecomandă tag v0.1.0 pentru a șterge, și de la distanță este de "origine", apoi pur și simplu:

git push origin :refs/tags/v0.1.0

Dacă ai nevoie, de asemenea, să ștergeți eticheta la nivel local:

git tag -d v0.1.0

A se vedea Adam Franco's a răspunde pentru o explicație de Git's neobișnuit : sintaxa pentru ștergere.

Comentarii (5)

Șterge toate tag-uri locale și de a lua lista de la distanță tag-uri:

git tag -l | xargs git tag -d
git fetch

Șterge de la distanță toate tag-uri

git tag -l | xargs -n 1 git push --delete origin

Curățați locale tag-uri

git tag -l | xargs git tag -d
Comentarii (4)

Pentru a elimina eticheta din depozitul de la distanță:

git push --delete origin TAGNAME

De asemenea, poate doriți să ștergeți eticheta la nivel local:

git tag -d TAGNAME
Comentarii (1)

De pe terminalul dumneavoastră, face acest lucru:

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

Acum du-te la Github.com și reîmprospăta, ele dispar.

Comentarii (1)

A șterge locale tag '12345'

git tag -d 12345

A șterge de la distanță tag '12345' (de exemplu; GitHub versiune prea)

git push origin :refs/tags/12345

abordare alternativă

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

Comentarii (0)
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name

Prima linie sterge `your_tag_name din repo locală și a doua șterge de la distanță repo. Acum your_tag a fost șters complet, atât la nivel local și de la distanță repo, dar uneori poate fi nevoie pentru a elimina elimină tag-ul care a elaborat de GitHub manual în presă secțiune.

Comentarii (2)

Doar observa că, dacă aveți o ramură de la distanță numit ca o telecomandă tag, aceste comenzi sunt ambigue:

git push origin :tagname
git push --delete origin tagname

Deci, trebuie să utilizați această comandă pentru a șterge eticheta:

git push origin :refs/tags/

și asta pentru a șterge ramura:

git push origin :refs/heads/

Dacă nu, v-ar obține o eroare de genul asta:

error: dst refspec  matches more than one.
error: failed to push some refs to ''
Comentarii (1)

Până la 100 de ori mai rapidă metodă pentru mii de tag-uri de la distanță

După ce a citit prin aceste răspunsuri în timp ce au nevoie pentru a șterge peste 11.000 de tag-uri, am învățat aceste metode se bazează sau xargs ia prea mult timp, dacă nu ai ore pentru a arde.

Luptă, am găsit două much modalități mai rapide. Pentru ambele, începe cu git tag-ul " sau " git ls-la distanță-tag-uri pentru a face o listă de etichete pe care doriți să-l ștergeți de pe telecomandă. În exemplele de mai jos puteți omite sau de a înlocuisorting_proccessing_etc cu orice grep 'ing,sortare' ing, coada 'ing saucap' ing vrei (e.g. grep -P "my_regex" | sortare | cap-n -200 etc) :


Această primă metodă este de departe cel mai rapid, poate 20 la 100 times mai repede decât folosind xargs, și funcționează cu mai puțin de mai multe thousand tag-uri la un moment dat.


git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "
Comentarii (3)

Dacă ați creat un tag numit `release01 într-un depozit Git te-ar scoate din repository-ul dvs. de a face următoarele:

git tag -d release01 
git push origin :refs/tags/release01 

Pentru a elimina unul de la un Mercurial depozit:

hg tag --remove featurefoo

Vă rugăm să referință https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

Comentarii (0)

Dacă utilizați SourceTree - o mare Git GUI - atunci puteți face cu ușurință acest lucru fără linie de comandă de a face următoarele:

  1. Deschide-ți depozit în SourceTree
  2. Selectați și extinde "Tag-uri" fila de pe stânga
  3. Click-dreapta pe eticheta pe care doriți șters
  4. Selectați "Șterge YOUR_TAG_NAME"
  5. În verificarea fereastră, selectați "Elimina Eticheta Din Telecomenzi"

YOUR_TAG_NAME va fi acum scos din depozit local și toate telecomenzile - fie că este vorba GitHub, BitBucket, sau oriunde altundeva ai listat ca o telecomanda de la depozit.

De asemenea, dacă ați șters un tag la nivel local, dar nu de pe telecomanda origini, și doriți să-l ștergeți de pretutindeni, apoi a crea o nouă etichetă care are același nume și este atașat la același comite ca originile. Apoi, repetați pașii de mai sus pentru a șterge peste tot.

Comentarii (1)

Ca @CubanX sugerat, am'am împărțit acest răspuns din original:

Aici este o metodă care este de câteva ori mai repede decât xargs și pot scară mult mai mult cu tweaking. Se folosește [API Github](http://developer.github.com/v3/git/refs/#delete-a-reference), un personal de acces token, si foloseste utilitarul [paralel`](http://www.gnu.org/software/parallel/parallel_tutorial.html).

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\"`

["paralel"] (https://www.gnu.org/software/parallel/parallel_tutorial.html) are mai multe moduri de operare, dar, în general, parallelizes orice comanda ai dat-o în timp ce permițându-vă să setați limitarea numărului de procese. Puteți modifica --locuri de munca 2 parametru pentru a permite operarea mai rapidă, dar am avut probleme cu Github's rata limitele, care sunt în prezent 5000/h, dar, de asemenea, pare să aibă o nedocumentate scurt-termen limită la fel de bine.


După aceasta,'ll probabil că doriți să ștergeți locale tag-uri prea. Acest lucru este mult mai rapid astfel încât să putem reveni la utilizarea xargs " și " git tag -d, ceea ce este suficient.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
Comentarii (5)

Am vrut pentru a elimina toate etichetele cu excepția celor care se potrivesc cu un model, astfel încât am putut șterge toate, dar în ultimele două luni de producție categorie, aici's ceea ce am folosit cu mare succes:

Șterge de la Distanță Toate Tag-uri & Exclude Expresia De a Șterge

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Șterge Toate Locale Tag-uri & Exclude Expresia De a Șterge

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Comentarii (0)

Alte răspunsuri subliniez modul de a realiza acest lucru, dar ar trebui să țină cont de consecințe, deoarece acesta este un depozit la distanță.

Git tag om pagină, în Pe Retagging secțiune, are o explicație bună despre cum să amabilitate să informeze de la distanță repo's alți utilizatori de schimbare. Ei da, chiar la îndemână un anunț șablon pentru a comunica modul în care alții ar trebui să-ți schimbă.

Comentarii (0)

Daca're folosind PowerShell, și doriți să-l ștergeți câteva din ele:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Desigur, puteți filtra, de asemenea, le înainte de a șterge:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
Comentarii (0)

Script simplu pentru a elimina dat tag la atât locale, cât și de origine locații. Cu o verificați dacă tag-ul există într-adevăr.

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

Cum să utilizați:

  • A crea script de shell fișier (de exemplu, git-tag-purge.sh) și lipiți conținutul.
  • chmod ta fișier script pentru a face executabil.
  • Face script-ul disponibil la nivel global
  • cd la git proiect
  • Call script (de exemplu,
    $>git-tag-purge.sh tag_name
    )
Comentarii (0)

Se pare ca o mulțime de muncă pentru ceva xargs deja de-a face. Privind înapoi prin acest thread, am'm ghicitul lentoarea cu xargspe care ai experimentat-o este pentru că originalul răspuns folosit xargs -n 1 atunci când l-am't într-adevăr nevoie.

Acest lucru este echivalent cu metoda ta doar că xargs automat oferte cu maxim de linie de comandă lungime:

git tag | sorting_processing_etc | xargs git push --delete origin

xargs poate rula procese în paralel prea. Metoda 2 cu xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

Cele de mai sus foloseste un maxim de 5 procese să se ocupe de un maxim de 100 de argumente în fiecare proces. Puteți experimenta cu argumente pentru a găsi ceea ce funcționează cel mai bine pentru nevoile dumneavoastra.

Comentarii (1)

Dacă aveți o etichetă creat pornind de la # de caractere, de exemplu #ST002, s-ar putea găsi că u sunt în măsură să o ștergeți folosind modele normale. de exemplu

git tag -d #STOO2

Nu va șterge eticheta, dar de ambalaj într-un String Literal ca asa

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

Că va obține șterse. În speranța că va ajuta pe cineva care a făcut greșeala de a utiliza # pentru a scrie nume de tag-uri.

Comentarii (0)

Aici este un local testcase să-l testeze la nivel local, fără încurcați cu telecomanda:

~/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
Comentarii (0)