Wie löscht man ein Git-Tag, das bereits gepusht wurde?
Wie löscht man ein Git-Tag, das bereits gepusht wurde?
Antworten:
Sie müssen nur einen 'leeren' Verweis auf den Namen des Remote-Tags senden:
git push origin :tagname
Oder verwenden Sie ausdrücklich die --delete
Option (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 Branch-Namespace verfügt, sodass Sie für einen Branch und ein Tag denselben Namen verwenden können. Wenn Sie sicherstellen möchten, dass Sie den Zweig nicht versehentlich anstelle des Tags entfernen können, können Sie eine vollständige Referenz angeben, die niemals einen Zweig löscht:
git push origin :refs/tags/tagname
Wenn Sie auch das lokale Tag löschen müssen, verwenden Sie:
git tag --delete tagname
Wenn Sie einen Zweig, ein Tag oder einen anderen Verweis 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, bei dem Sie Ihren Hauptzweig in den Hauptzweig des Ursprungs verschieben, ist:
git push origin refs/heads/master:refs/heads/master
Welche aufgrund von Standardpfaden kann verkürzt werden auf:
git push origin master:master
Tags funktionieren genauso:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
Was auch gekürzt werden kann zu:
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.
git push --delete origin tag1 tag2
. Gleiches gilt für das Löschen lokaler Tagsgit tag -d tag1 tag2
tag
ist nur einem einzelnen Commit zugeordnet. Aus diesem Grund ist der Filialname irrelevant.
git tag -d `git tag`
alle lokalen Tags gelöscht werden. Gleiches gilt für die git push --delete origin `git tag`
Annahme, dass Sie die Remote-Tags lokal abgerufen haben. Das war praktisch in einer Testumgebung.
Ein einfacher Weg ist
git push --delete origin YOUR_TAG_NAME
Die Syntax des IMO-Präfix-Doppelpunkts ist in dieser Situation etwas seltsam
git push --delete origin "TAGNAME"
wobei TAGNAME der Name des ursprünglichen Tags ist.
tag
vor Ihren Tag-Namen setzen, um sicherzustellen, dass Sie das Tag und nicht den Zweig erhalten.
refs/tags/
: refs/tags/v2.3.1
.
Wenn Sie ein Remote-Tag v0.1.0
zum Löschen haben und Ihr Remote ist origin
, 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
In der Antwort von Adam Franco finden Sie eine Erklärung der ungewöhnlichen :
Löschsyntax von Git .
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?
:tagname
für die Fernlöschung funktionieren.
Löschen Sie alle lokalen Tags und rufen Sie die Liste der Remote-Tags ab :
git tag -l | xargs git tag -d
git fetch
Entfernen Sie alle Remote-Tags
git tag -l | xargs -n 1 git push --delete origin
Bereinigen Sie lokale Tags
git tag -l | xargs git tag -d
Gehen Sie von Ihrem Terminal aus folgendermaßen 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.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
aus dem lokalen Repo gelöscht.your_tag_name
aus Remote- Repo.git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
Beachten Sie nur, dass diese Befehle nicht eindeutig sind, wenn Sie einen Remote-Zweig haben, der als Remote-Tag bezeichnet wird:
git push origin :tagname
git push --delete origin tagname
Sie müssen diesen Befehl also verwenden, um das Tag zu löschen:
git push origin :refs/tags/<tag>
und dieser, um den Zweig zu löschen:
git push origin :refs/heads/<branch>
Wenn nicht, würden Sie eine Fehlermeldung wie folgt erhalten:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
Nachdem ich diese Antworten gelesen hatte und mehr als 11.000 Tags löschen musste, lernte ich, dass diese Methoden zuverlässig sind oder xargs
viel zu lange dauern, es sei denn, Sie haben Stunden zum Brennen.
Ich kämpfte und fand zwei viel schnellere Wege. Beginnen Sie für beide mit git tag
oder git ls-remote --tags
erstellen Sie eine Liste der Tags, die Sie auf der Fernbedienung löschen möchten. In den folgenden Beispielen können Sie alles weglassen oder durch ein sorting_proccessing_etc
beliebiges grep
Ing, sort
Ing, tail
Ing oder head
Ing ersetzen ( z. B. grep -P "my_regex" | sort | head -n -200
usw. ):
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, durch Zeilen getrennte Liste von Tags wird in eine einzelne Zeile mit durch Leerzeichen getrennten Tags konvertiert, denen jeweils solche vorangestellt :
sind. . .
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
Wenn Sie git push
dieses Format-Tag verwenden, wird nichts in jede Remote-Referenz verschoben und gelöscht (das normale Format für das Verschieben auf diese Weise ist local_ref_path:remote_ref_path
).
Nach diesen beiden Methoden möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, so dass wir wieder auf xargs
und zurückgreifen können git tag -d
, was ausreicht.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
ODER ähnlich wie beim Remote-Löschen:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
Wenn Sie SourceTree - eine großartige Git-GUI - verwenden, können Sie dies ganz einfach ohne Befehlszeile tun, indem Sie Folgendes tun:
YOUR_TAG_NAME wird nun aus Ihrem lokalen Repository und allen Fernbedienungen 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.
Wenn Sie ein Tag erstellt haben, das release01
in einem Git-Repository aufgerufen wird, entfernen Sie es wie folgt aus Ihrem Repository:
git tag -d release01
git push origin :refs/tags/release01
So entfernen Sie eine aus einem Mercurial-Repository:
hg tag --remove featurefoo
Bitte verweisen Sie auf https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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 $_ }
Wie @CubanX vorgeschlagen hat, habe ich diese Antwort von meinem Original getrennt:
xargs
und mit Optimierungen viel mehr skalieren kann. Es verwendet die 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 ihm geben, 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 den Geschwindigkeitsbegrenzungen von Github , die derzeit bei 5000 / h liegen, aber auch eine undokumentierte kurzfristige Begrenzung zu haben scheint.
Danach möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, so dass wir wieder auf xargs
und zurückgreifen können git tag -d
, was ausreicht.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
Die anderen Antworten zeigen, wie dies erreicht werden kann. Sie sollten jedoch die Konsequenzen berücksichtigen, 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.
Ich wollte alle Tags entfernen, mit Ausnahme derjenigen, die einem Muster entsprechen, damit ich alle bis auf die letzten Monate der Produktions-Tags löschen konnte. Folgendes habe ich mit großem Erfolg verwendet:
Löschen Sie alle Remote-Tags und schließen Sie den Ausdruck vom Löschen aus
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
Einfaches Skript zum Entfernen eines bestimmten Tags von lokalen und Ursprungsorten. Mit einer Überprü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:
$> git-tag-purge.sh tag_name)
Scheint, als ob eine Menge Arbeit für etwas xargs
bereits erledigt ist. Wenn ich durch diesen Thread zurückblicke, schätze ich, dass die Langsamkeit xargs
, die Sie erlebt haben, darin besteht, dass die ursprüngliche Antwort verwendet wurde, xargs -n 1
als es nicht wirklich nötig war.
Dies entspricht Ihrer Methode 1, xargs
mit der Ausnahme, dass automatisch die maximale Befehlszeilenlänge berücksichtigt wird:
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 Verfahren 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.
Wenn Sie ein Tag erstellt haben, das mit dem Zeichen # beginnt #ST002
, können Sie möglicherweise feststellen, dass Sie nicht mit normalen Mustern löschen können. dh
git tag -d #STOO2
Löscht das Tag nicht, sondern verpackt es wie folgt in ein String-Literal
git tag -d "#ST002" or git tag -d '#ST002'
Dadurch wird es gelöscht. In der Hoffnung, dass es jemandem hilft, der den Fehler gemacht hat, # zum Schreiben von Tag-Namen zu verwenden.
Hier ist ein lokaler Testfall, um ihn lokal zu testen, ohne mit einer Fernbedienung zu spielen:
~/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
Hallo, ich wollte nur einen Alias teilen, den ich erstellt habe und 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 aus wie:
-->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)