Wir verwenden Tags in Git als Teil unseres Bereitstellungsprozesses. Von Zeit zu Zeit möchten wir diese Tags bereinigen, indem wir sie aus unserem Remote-Repository entfernen.
Das ist ziemlich einfach. Ein Benutzer löscht das lokale Tag und das Remote-Tag in einem Befehlssatz. Wir haben ein kleines Shell-Skript, das beide Schritte kombiniert.
Der 2. (3., 4., ...) Benutzer verfügt jetzt über lokale Tags, die nicht mehr auf der Fernbedienung angezeigt werden.
Ich suche nach einem ähnlichen Befehl, git remote prune origin
der lokale Verfolgungszweige bereinigt, für die der Remote-Zweig gelöscht wurde.
Alternativ könnte ein einfacher Befehl zum Auflisten entfernter Tags verwendet werden, um sie mit den über zurückgegebenen lokalen Tags zu vergleichen git tag -l
.
git config fetch.pruneTags true
dasgit fetch
tun, was Sie wollen! Siehe meine Antwort auf diese andere Frage .Antworten:
Gute Frage. :) Ich habe keine vollständige Antwort ...
Das heißt, Sie können eine Liste der Remote-Tags über erhalten
git ls-remote
. Um die Tags in dem Repository aufzulisten, auf die verwiesen wirdorigin
, führen Sie Folgendes aus:Das gibt eine Liste von Hashes und Anzeigenamen zurück, wie zum Beispiel:
Sie könnten sicherlich ein Bash-Skript zusammenstellen, um die von dieser Liste generierten Tags mit den lokal vorhandenen Tags zu vergleichen. Schauen Sie sich an
git show-ref --tags
, welche die Tag-Namen in der gleichen Form wiegit ls-remote
) generiert .Nebenbei
git show-ref
hat eine Option, die das Gegenteil von dem tut, was Sie möchten. Der folgende Befehl listet alle Tags in der Remote-Verzweigung auf, die Sie lokal nicht haben:quelle
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
Das ist eine großartige Frage, ich hatte mich das Gleiche gefragt.
Ich wollte kein Skript schreiben und suchte nach einer anderen Lösung. Der Schlüssel besteht darin, zu erkennen, dass Sie ein Tag lokal löschen und dann mit git fetch vom Remote-Server "zurückholen" können. Wenn das Tag auf der Fernbedienung nicht vorhanden ist, bleibt es gelöscht.
Daher müssen Sie zwei Zeilen in der folgenden Reihenfolge eingeben:
Diese:
Löschen Sie alle Tags aus dem lokalen Repo. FWIW, xargs platziert jedes von "tag -l" ausgegebene Tag in der Befehlszeile für "tag -d". Ohne dies wird git nichts löschen, da es nicht stdin (dummes git) liest.
Rufen Sie alle aktiven Tags vom Remote-Repo ab.
Dies funktioniert sogar unter Windows.
quelle
git tag prune origin
Befehl geben.git tag -l | %{git tag -d $_}
, um dies in PowerShell zum Laufen zu bringen. Ich bin mir über niemanden sicher.Von Git v1.7.8 bis v1.8.5.6 können Sie Folgendes verwenden:
Aktualisieren
Dies funktioniert bei neueren Versionen von git (ab Version 1.9.0) aufgrund des Commits e66ef7ae6f31f2 nicht . Ich möchte es jedoch nicht wirklich löschen, da es bei einigen Leuten funktioniert hat.
Wie von "Chad Juliano" vorgeschlagen, können Sie mit allen Git-Versionen seit Version 1.7.8 den folgenden Befehl verwenden:
Möglicherweise müssen Sie den Tag-Teil in Anführungszeichen setzen (z. B. unter Windows), um eine Platzhaltererweiterung zu vermeiden:
quelle
git fetch --prune <remote> +refs/tags/*:refs/tags/*
funktionierte nicht in ZSH, aber es funktioniert in BASH*
aber wenn Sie ein einfaches Anführungszeichen setzen, sollte es in Ordnung sein.git fetch origin --prune --prune-tags
ODERgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ODERgit fetch <url of origin> --prune --prune-tags
ODERgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
Beschneiden Sie sowohl Fernverfolgungszweige als auch Tags. in git 2.18 version eingecheckt.Wenn Sie nur die Tags möchten, die auf der Fernbedienung vorhanden sind, löschen Sie einfach alle Ihre lokalen Tags:
Und dann holen Sie alle Remote-Tags:
quelle
xargs
. Wenn Sie mehr Tags alsARG_MAX
oder ähnliche Einschränkungen haben, funktioniert dies nicht. Unwahrscheinlich, aber möglich, und deshalbxargs
ist es großartig.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Obligatorischer Alias-Befehl. Genießen. :-)Es sieht so aus, als ob neuere Versionen von Git (ich bin auf Git v2.20) es einem erlauben, einfach zu sagen
Viel sauberer!
https://git-scm.com/docs/git-fetch#_pruning
Sie können git auch so konfigurieren, dass Tags beim Abrufen immer beschnitten werden:
Wenn Sie Tags nur beim Abrufen von einer bestimmten Fernbedienung entfernen möchten, können Sie diese
remote.<remote>.pruneTags
Option verwenden. Zum Beispiel, um Tags beim Abrufen vom Ursprung, aber nicht von anderen Fernbedienungen immer zu beschneiden,quelle
Alle Versionen von Git seit v1.7.8 verstehen sich
git fetch
mit einer Referenz, während seit v1.9.0 die--tags
Option die Option überschreibt--prune
. Versuchen Sie Folgendes, um eine allgemeine Lösung zu finden:Weitere Informationen dazu, wie sich das Verhalten von "--tags" mit "--prune" in Git v1.9.0 geändert hat, finden Sie unter: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
quelle
origin
durchupstream
und Git korrigiert meine lokalen Tags basierend auf dem Upstream; Als nächstes wurdegit push origin :<deleted-tag-name>
meine GitHub-Gabel aktualisiert und das gelöschte Tag entfernt.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git unterstützt nativ die Bereinigung lokaler Tags:
Dieser Befehl ruft die neuesten Tags ab und entfernt alle gelöschten Tags.
quelle
Das ist eine gute Methode:
git tag -l | xargs git tag -d && git fetch -t
Quelle: demisx.GitHub.io
quelle
Zeigen Sie den Unterschied zwischen lokalen und Remote-Tags:
git tag
gibt die Liste der lokalen Tags angit ls-remote --tags
Gibt die Liste der vollständigen Pfade zu Remote-Tags ancut -f2 | grep -v '\^' | sed 's#refs/tags/##'
analysiert nur den Tag-Namen aus der Liste der Remote-Tag-PfadeDie Zeilen, die mit "<" beginnen, sind Ihre lokalen Tags, die sich nicht mehr im Remote-Repo befinden. Wenn es nur wenige sind, können Sie sie einzeln manuell entfernen. Wenn es viele sind, führen Sie mehr Greping und Piping durch, um sie zu automatisieren.
quelle
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, sondern mit einer Zahl gefolgt von einem Komma und dann wie die ersten drei Zeichen eines Commit-Hash (?) Aussehen. zB7,8d4
...Ich habe gerade einen git sync-local-tags-Befehl zu pivotal_git_scripts Gem fork auf GitHub hinzugefügt:
https://github.com/kigster/git_scripts
Installieren Sie das Gem und führen Sie dann "git sync-local-tags" in Ihrem Repository aus, um die lokalen Tags zu löschen, die auf der Fernbedienung nicht vorhanden sind.
Alternativ können Sie dieses Skript einfach unten installieren und es "git-sync-local-tags" nennen:
quelle
Ich weiß, dass ich zu spät zur Party komme, aber jetzt gibt es eine schnelle Antwort darauf:
Ja, es ist jetzt eine Option zum Abrufen.
Wenn Sie nicht holen und nur beschneiden möchten:
quelle
Wie wäre es damit - alle lokalen Tags löschen und dann erneut abrufen? In Anbetracht dessen, dass Ihr Repo möglicherweise Submodule enthält:
quelle
TortoiseGit kann jetzt Tags vergleichen.
Das linke Protokoll befindet sich auf der Fernbedienung, das rechte ist lokal.
Verwenden der Funktion "Tags vergleichen" im Dialogfeld "Synchronisieren":
Siehe auch TortoiseGit Ausgabe 2973
quelle
Die gleiche Antwort wie @Richard W, jedoch für Windows (PowerShell)
quelle
Ich füge den Befehl
SourceTree
als benutzerdefinierte Aktion unter meinem MacOS hinzu.Einstellung
Custom Actions
durchSourcetree
->Preferences...
->Custom Actions
Script to run
muss dergit
Weg sein.Ich verwende,
git fetch --prune --prune-tags origin
um Tags von Remote zu Local zu synchronisieren.quelle
In der neuen Git-Version (wie v2.26.2)
Sie müssten also laufen:
quelle