wake-up-neo.com

Wie synchronisiere ich in git meine Tags mit einem Remote-Server?

Gibt es eine Möglichkeit, meine lokalen Git-Tags mit den Tags einer Fernbedienung in Lockstep zu halten? Das bedeutet, dass Sie nicht nur neue Tags erhalten, wenn sie erstellt werden (wie üblich, wenn fetching/pulling, sondern auch Prune-Tags nicht mehr auf einer Remote-Station vorhanden sind und vorhandene Tags auch löschen, wenn andere Personen dies tun git Push -f 's ein Tag . Ich weiß, ich kann git fetch remotename gefolgt von git remote Prune remotename ein ähnliches Verhalten für Verzweigungen erzielen.

37
mlb

... auch keine Prune-Tags mehr auf einer Fernbedienung

git fetch bietet mit Git 2.17 (Q2 2018) eine praktische Abkürzung, um __., um veraltete Tags zu entfernen, die lokal gespeichert werden.

Siehe commit 6317972 , Commit 97716d2 , Commit e249ce0 , Commit 627a129 , Commit d0e0747 , Commit 2c72ed7 , Commit e1790f9 , Festschreiben 59caf52 , Festschreiben 82f34e0 , Festschreiben 6fb23f5 , Festschreiben ca3065e , Festschreiben bf16ab7 , Festschreiben eca142d , Festschreiben 750d0da , Festschreiben 0711883 , Festschreiben ce3ab21 , Festschreiben aa59e0e (09 Feb 2018) von Ævar Arnfjörð Bjarmason (avar) .
(Zusammengeführt durch Junio ​​C Hamano - gitster - in commit c1a7902 , 06 Mar 2018)

fetch: fügt eine --Prune-tags-Option und fetch.pruneTags config hinzu

Fügen Sie eine --Prune-tags-Option zu git-fetch zusammen mit der fetch.pruneTags config-Option und einer -P-Kurzschreibweise hinzu (-p ist --Prune).
Dies ermöglicht Folgendes:

git fetch -p -P
git fetch --Prune --Prune-tags
git fetch -p -P Origin
git fetch --Prune --Prune-tags Origin

Oder einfach:

git config fetch.Prune true &&
git config fetch.pruneTags true &&
git fetch

Anstelle der viel ausführlicheren:

git fetch --Prune Origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/Origin/*'

Vor diesem Feature war es schmerzhaft, den Anwendungsfall des Ziehens zu unterstützen von einem Repo, bei dem beide und-Tags gelöscht wurden regelmäßig, und haben unsere lokalen Referenzen vorgelagert.

Bei der Arbeit erstellen wir im Repo für jedes Rollout Deployment-Tags und Es gibt Lose davon, also werden sie innerhalb von Wochen für .__ archiviert. Leistungsgründe.

Ohne diese Änderung ist es schwierig, solche Repos zentral in .__ zu konfigurieren. /etc/gitconfig (auf Servern, die nur zum Arbeiten mit verwendet werden). Sie müssen fetch.Prune=true global einstellen und dann für jedes Repo:

git -C {} config --replace-all remote.Origin.fetch "refs/tags/*:refs/tags/*" "^\+*refs/tags/\*:refs/tags/\*$"

Jetzt kann ich einfach fetch.pruneTags=true auch in /etc/gitconfig setzen, Benutzer, die "git pull" ausführen, erhalten automatisch die Löschung Semantik will ich.

10
VonC

Folgendes hat für mich gearbeitet:

git fetch --Prune --tags
39

Ein wenig Forschung hat gezeigt, dass git keine Möglichkeit hat, den Unterschied zwischen lokalen und fremden Tags zu erkennen (alle Tags gehen nach .git/refs/tags /). Daher ist es nicht möglich, den Unterschied zwischen lokal erstellten Tags und Prune-fähigen Remote-Tags zu ermitteln. Die Optionen beschränken sich dann auf: eine ständig wachsende Anzahl von Tags oder nur die Tags, die sich auf dem Server befinden.

git Push --tags Origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags

Lassen Sie die erste Zeile für das letztere Verhalten fallen, und es könnte sein, dass der Alias ​​für häufige Verwendung verwendet wird.

Eine Alternative wäre, eine Verzweigung an einem Tag-Punkt zu erstellen (da sie als local/remote identifiziert werden kann) und nie mehr darauf schreiben. Durch die Verwendung von Remotename/Branchname als Tag zum Auschecken bleiben die Tags synchron (zusätzlich zu git fetch und git remote Prune remotename).

So oder so ist es ein Hack, und die "richtige" Antwort ist, die Tags ständig zu ändern.

17
mlb

Eine andere Lösung, die eigentlich für mich funktioniert:

git tag -l | xargs git tag -d && git fetch -t
6
Ron

git Push --tags schiebt Ihre lokalen Tags zum Server hoch. Standardmäßig zieht git fetch (die erste Hälfte von git pull oder git pull --rebase) Tags, aber Sie können -t oder --tags angeben, um alle zu ziehen.

Ich bin nicht sicher, wie man entfernt entfernte Tags bereinigen kann, aber der Abruf sollte alle mit Gewalt aktualisierten Tags herunterziehen.

5
LJHarb

disclaimer dies verwendet git-Interna (einige können argumentieren, dass das Dateisystem ist eine git-Schnittstelle ist, aber das ist für einen anderen Tag: D)

# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .git/refs/tags/*

# Download all the tags from the remote
git fetch --tags
4
Anthony Sottile

Hier ist eine alternative Lösung:

git fetch -p +refs/tags/*:refs/tags/*

Aus dem git fetch doc:

-p --Pflaume

Entfernen Sie vor dem Abrufen alle Verweise auf Remote-Tracking, die nicht mehr auf auf der Fernbedienung vorhanden. Tags werden nicht beschnitten, wenn sie .__ sind. Wird nur wegen des automatisch folgenden Tags oder eines .__ abgerufen. --tags Option. If-Tags werden jedoch aufgrund eines expliziten refspec abgerufen (entweder in der Befehlszeile oder in der Remote-Konfiguration, z. B., wenn die Remote mit der Option --mirror geklont wurde), und dann __. sind auch beschnitten.

0
solstice333

verwenden Sie diesen Befehl, um Tags zu synchronisieren (alle lokalen löschen und dann alle entfernten abrufen).

git tag -d $(git tag) # delete all local tags
git fetch --all # fetch all remote to local
0
xxy