Cum poti sterge un Git tag-ul care a fost deja împinse?
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
Î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.
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.
Ș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
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.
git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
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.
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/<tag>
și asta pentru a șterge ramura:
git push origin :refs/heads/<branch>
Dacă nu, v-ar obține o eroare de genul asta:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
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 înlocui
sorting_proccessing_etc cu orice grep 'ing,
sortare' ing, coada 'ing sau
cap' ing vrei (e.g. grep -P "my_regex" | sortare | cap-n -200
etc) :
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 "<" for zsh
Cum face acest lucru?
Normal, linie separate lista de tag-uri este convertit la o singură linie de spațiul-separat tag-uri, fiecare prefixate cu :
așa . . .
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
Folosind git push
cu acest format de etichetă împinge nothing în fiecare ref la distanță, ștergeți-l (normal format pentru a impinge acest fel este local_ref_path:remote_ref_path
).
După ambele metode, te'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
SAU similare de la distanță șterge:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
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
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:
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.
Ca @CubanX sugerat, am'am împărțit acest răspuns din original:
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
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
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ă.
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 $_ }
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:
$>git-tag-purge.sh tag_name)
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.
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.
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