it-swarm.com.de

Wie lösche ich ein Remote-Tag?

Wie lösche ich ein Git-Tag, das bereits gepusht wurde?

2936
markdorison

Sie müssen lediglich eine leere Referenz auf den Namen des entfernten Tags pushen:

git Push Origin :tagname

Oder verwenden Sie ausdrücklich die Option --delete (oder -d, wenn Ihre Git-Version älter als 1.8.0 ist):

git Push --delete Origin tagname

Beachten Sie, dass git über einen Tag-Namespace und einen Zweig-Namespace verfügt, sodass Sie für einen Zweig und für einen Tag denselben Namen verwenden können. Wenn Sie sicherstellen möchten, dass Sie den Zweig anstelle des Tags nicht versehentlich entfernen können, können Sie den vollständigen Verweis angeben, der einen Zweig niemals löscht:

git Push Origin :refs/tags/tagname

Wenn Sie auch das lokale Tag löschen müssen, verwenden Sie:

git tag --delete tagname

Hintergrund

Wenn Sie einen Zweig, ein Tag oder eine andere Referenz in ein Remote-Repository verschieben, müssen Sie angeben, "welches Repo, welche Quelle, welches Ziel".

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

Ein Beispiel aus der Praxis, in dem Sie Ihren Master-Zweig in den Master-Zweig von Origin verschieben, ist:

git Push Origin refs/heads/master:refs/heads/master

Welche aufgrund von Standardpfaden kann verkürzt werden:

git Push Origin master:master

Tags funktionieren genauso:

git Push Origin refs/tags/release-1.0:refs/tags/release-1.0

Welches kann auch gekürzt werden:

git Push Origin release-1.0:release-1.0

Wenn Sie die Quellreferenz (den Teil vor dem Doppelpunkt) weglassen, drücken Sie "nichts" zum Ziel und löschen die Referenz auf der Remote-Seite.

4889
Adam Franco

Ein einfacher Weg ist

git Push --delete Origin YOUR_TAG_NAME

Die IMO-Syntax mit vorangestelltem Doppelpunkt ist in dieser Situation etwas seltsam

335
quexer

Wenn Sie ein entferntes Tag v0.1.0 zum Löschen haben und Ihre Fernbedienung Origin ist, dann einfach:

git Push Origin :refs/tags/v0.1.0

Wenn Sie das Tag auch lokal löschen müssen:

git tag -d v0.1.0

Siehe Adam Franco 's answer für eine Erklärung der ungewöhnlichen : -Syntax von Git zum Löschen.

188
Alex Dean

Löschen Sie alle lokalen Tags und rufen Sie die Liste der Remote-Tags ab:

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

Alle entfernten Tags entfernen

git tag -l | xargs -n 1 git Push --delete Origin

Lokale Tags bereinigen

git tag -l | xargs git tag -d
99

So entfernen Sie das Tag aus dem Remote-Repository:

git Push --delete Origin TAGNAME

Möglicherweise möchten Sie das Tag auch lokal löschen:

git tag -d TAGNAME
30
Andrea

Gehen Sie von Ihrem Terminal aus wie folgt vor:

git fetch
git tags
git tag -d {tag-name}
git Push Origin :refs/tags/{tag-name}

Gehen Sie jetzt zu Github.com und aktualisieren Sie, sie verschwinden.

23
Mahmoud Zalt

Beachten Sie nur, dass die folgenden Befehle nicht eindeutig sind, wenn Sie einen Remote-Zweig mit dem Namen Remote-Tag haben:

git Push Origin :tagname
git Push --delete Origin tagname

Sie müssen also diesen Befehl verwenden, um das Tag zu löschen:

git Push Origin :refs/tags/<tag>

und dies um den Zweig zu löschen:

git Push Origin :refs/heads/<branch>

Wenn nicht, würden Sie einen Fehler wie diesen erhalten:

error: dst refspec <tagname> matches more than one.
error: failed to Push some refs to '<repo>'
14

Lokales Tag '12345' löschen

git tag -d 12345

Remote Tag '12345' löschen (zB auch GitHub Version)

git Push Origin :refs/tags/12345

alternativer Ansatz

git Push --delete Origin tagName
git tag -d tagName

enter image description here

12
Lyes CHIOUKH

Bis zu 100-mal schnellere Methode für Tausende von Remote-Tags

Nachdem ich diese Antworten gelesen hatte und mehr als 11.000 Tags löschen musste, lernte ich, dass diese Methoden, die sich auf xargs beziehen, viel zu lange dauern, es sei denn, Sie haben Stunden zum Brennen.

Mühsam fand ich zwei viel schnellere Wege. Beginnen Sie für beide mit git tag oder git ls-remote --tags, um eine Liste der Tags zu erstellen, die Sie auf der Fernbedienung löschen möchten. In den folgenden Beispielen können Sie sorting_proccessing_etc weglassen oder durch ein beliebiges greping, sorting, tailing oder heading ersetzen, das Sie möchten ( zB grep -P "my_regex" | sort | head -n -200 etc ):


Diese erste Methode ist mit Abstand die schnellste, vielleicht 20- bis 100-mal schneller als die Verwendung von xargs und funktioniert mit mindestens mehreren Tausend Tags gleichzeitig.

git Push Origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

Wie funktioniert das? Die normale, zeilengetrennte Liste von Tags wird in eine einzelne Zeile von durch Leerzeichen getrennten Tags konvertiert, denen jeweils : vorangestellt ist. . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

Wenn Sie git Push mit diesem Format-Tag verwenden, wird nichts in jede Remote-Referenz eingefügt und diese gelöscht (das normale Format für das Übertragen auf diese Weise lautet local_ref_path:remote_ref_path).

Methode zwei ist als separate Antwort aufgeschlüsselt an anderer Stelle auf derselben Seite


Nach diesen beiden Methoden möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, sodass wir wieder xargs und git tag -d verwenden können, was ausreichend ist.

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

ODER ähnlich wie beim entfernten Löschen:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
9
TonyH

Wenn Sie ein Tag namens release01 in einem Git-Repository erstellt haben, entfernen Sie es aus Ihrem Repository, indem Sie folgendermaßen vorgehen:

git tag -d release01 
git Push Origin :refs/tags/release01 

So entfernen Sie eines aus einem Mercurial-Repository:

hg tag --remove featurefoo

Bitte beziehen Sie sich auf https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

9
MeganZhou
git tag -d your_tag_name
git Push Origin :refs/tags/your_tag_name

Die erste Zeile löscht your_tag_name aus dem lokalen Repo und die zweite Zeile löscht es aus dem entfernten Repo. Jetzt wurde your_tag vollständig gelöscht, sowohl vom lokalen als auch vom Remote-Repository. Manchmal müssen Sie jedoch gelöschte Tags entfernen, die von GitHub manuell in Ihrem Release-Bereich erstellt wurden.

8
kokabi

In den anderen Antworten wird erläutert, wie dies erreicht werden kann. Beachten Sie jedoch die Konsequenzen, da dies ein Remote-Repository ist.

Die git-Tag-Manpage im Abschnitt On Retagging enthält eine gute Erklärung, wie Sie die anderen Benutzer des Remote-Repos höflich über die Änderung informieren können. Sie bieten sogar eine praktische Ankündigungsvorlage, mit der Sie kommunizieren können, wie andere Ihre Änderungen erhalten sollen.

6
Richard Venable

Wenn Sie SourceTree - eine großartige Git-GUI - verwenden, können Sie dies ganz einfach ohne die Befehlszeile tun, indem Sie folgende Schritte ausführen:

  1. Öffnen Sie Ihr Repository in SourceTree
  2. Wählen und erweitern Sie die Registerkarte "Tags" auf der linken Seite
  3. Klicken Sie mit der rechten Maustaste auf das zu löschende Tag
  4. Wähle "DEIN_TAG_NAME löschen"
  5. Wählen Sie im Bestätigungsfenster "Remove Tag From Remotes" aus.

YOUR_TAG_NAME wird nun aus Ihrem lokalen Repository und allen Remotes entfernt - sei es GitHub, BitBucket oder wo immer Sie als Remote für dieses Repository aufgeführt sind.

Wenn Sie ein Tag lokal, aber nicht auf den Remote-Ursprüngen gelöscht haben und es überall löschen möchten, erstellen Sie einfach ein neues Tag mit demselben Namen und demselben Commit wie die Ursprünge. Wiederholen Sie dann die obigen Schritte, um sie überall zu löschen.

6
Chris Sprague

Ich wollte alle Tags entfernen, mit Ausnahme derjenigen, die mit einem Muster übereinstimmen, damit ich alle Tags mit Ausnahme der letzten paar Monate der Produktion löschen konnte. Das habe ich mit großem Erfolg getan:

Alle entfernten Tags löschen und Ausdruck von Löschen ausschließen

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

Alle lokalen Tags löschen und Ausdruck vom Löschen ausschließen

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

Wie @CubanX vorschlug, habe ich diese Antwort von meinem Original getrennt:

Hier ist eine Methode, die um ein Vielfaches schneller ist als xargs und mit dem Tweaken viel mehr skalieren kann. Es verwendet das Github API , ein persönliches Zugriffstoken, und nutzt das Dienstprogramm 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 hat viele Betriebsmodi, parallelisiert jedoch im Allgemeinen jeden Befehl, den Sie eingeben, und ermöglicht es Ihnen, die Anzahl der Prozesse zu begrenzen. Sie können den --jobs 2 -Parameter ändern, um einen schnelleren Betrieb zu ermöglichen, aber ich hatte Probleme mit Githubs Ratenbegrenzungen , die derzeit 5000/h betragen, aber auch eine undokumentierte kurzfristige Begrenzung zu haben scheinen Gut.


Danach möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, sodass wir wieder xargs und git tag -d verwenden können, was ausreichend ist.

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

Scheint viel Arbeit für etwas zu haben, das xargs bereits erledigt. Im Rückblick auf diesen Thread schätze ich, dass die Langsamkeit bei xargs, die Sie erlebt haben, darauf zurückzuführen ist, dass die ursprüngliche Antwort xargs -n 1 verwendet hat, als dies nicht wirklich nötig war.

Dies entspricht der ersten Methode, mit der Ausnahme, dass xargs automatisch die maximale Befehlszeilenlänge behandelt:

git tag | sorting_processing_etc | xargs git Push --delete Origin

xargs kann auch Prozesse parallel ausführen. Methode 2 mit xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git Push --delete Origin

Das obige Beispiel verwendet maximal 5 Prozesse, um maximal 100 Argumente in jedem Prozess zu verarbeiten. Sie können mit den Argumenten experimentieren, um herauszufinden, was für Ihre Anforderungen am besten geeignet ist.

4
HomerM

Einfaches Skript zum Entfernen eines bestimmten Tags von lokalen und Origin-Speicherorten. Mit einer Prüfung, ob das Tag wirklich existiert.

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

Wie benutzt man:

  • Erstellen Sie eine Shell-Skriptdatei (z. B. git-tag-purge.sh) und fügen Sie den Inhalt ein.
  • chmod Ihre Skriptdatei, um es ausführbar zu machen.
  • Stellen Sie das Skript global zur Verfügung
  • cD zu Ihrem Git-Projekt
  • Skript aufrufen (z. B.
    $> git-tag-purge.sh tag_name
    )
4
Dimitar Vlasev

Wenn Sie PowerShell verwenden und einige davon löschen möchten:

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

# Remote tags:
git tag -l | foreach { git Push --delete Origin $_ }

Natürlich können Sie sie auch vor dem Löschen filtern:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
3
rsenna

Wenn Sie ein Tag erstellt haben, das mit dem Zeichen # beginnt, z. #ST002, Sie stellen möglicherweise fest, dass Sie mit normalen Mustern nicht löschen können. d.h.

git tag -d #STOO2

Löscht das Tag nicht, sondern fügt es in ein String-Literal ein

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

Damit wird es gelöscht. Die Hoffnung, dass es jemandem hilft, der den Fehler gemacht hat, # zum Schreiben von Tag-Namen zu verwenden.

2
MernXL

Hier ist ein lokaler Testfall, mit dem Sie ihn lokal testen können, ohne sich mit einer Fernbedienung herumschlagen zu müssen:

~/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
2
Adnan Y

Hallo, ich wollte nur einen von mir erstellten Alias ​​freigeben, der dasselbe tut:

Fügen Sie Ihrer ~/.gitconfig Folgendes hinzu

[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"

Die Verwendung sieht so aus:

-->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)
1
ranma2913