Git gc oder prune gleichzeitig mit receive

Git gc oder prune gleichzeitig mit receive

Es gibt zwei Hosts A und B.

A bedient Git und empfängt von B gepushte Revs.

B schiebt nur und empfängt nie, es sei denn, es zieht selbst.

Man kann B auf GC oder Prune Revs einstellen, da keine Gefahr von gleichzeitigen Vorgängen besteht. Kann B jedoch die Drehzahl auf A übertragen, während A GCs durchführt oder beschneidet? Was passiert?

Ich möchte im Grunde wissen, ob ich die Kommunikation von A abbrechen muss, wenn ich GCs oder Prunes ausführe, oder ob das nicht nötig ist.

Antwort1

Git GCsmanpageZustand:

Wenn git gc gleichzeitig mit einem anderen Prozess ausgeführt wird, besteht das Risiko, dass ein Objekt gelöscht wird, das der andere Prozess verwendet, für das aber kein Verweis erstellt wurde. Dies kann dazu führen, dass der andere Prozess fehlschlägt, oder das Repository beschädigen, wenn der andere Prozess später einen Verweis auf das gelöschte Objekt hinzufügt. Git verfügt über zwei Funktionen, die dieses Problem erheblich mildern:

  1. Alle Objekte, deren Änderungszeitpunkt neuer ist als das --prune-Datum, werden zusammen mit allem, was von dort aus erreichbar ist, beibehalten.

  2. Die meisten Vorgänge, bei denen ein Objekt zur Datenbank hinzugefügt wird, aktualisieren den Änderungszeitpunkt des Objekts, wenn es bereits vorhanden ist, sodass Nr. 1 zutrifft.

Allerdings stellen diese Funktionen keine umfassende Lösung dar, sodass Benutzer, die Befehle gleichzeitig ausführen, mit einem gewissen Beschädigungsrisiko leben müssen (das in der Praxis jedoch gering zu sein scheint).

Und weiter:

--prune=<date>

Löscht lose Objekte, die älter sind als das Datum (Standard ist 2 Wochen her, kann durch die Konfigurationsvariable gc.pruneExpire überschrieben werden). --prune=nowLöscht lose Objekte ungeachtet ihres Alters und erhöht das Risiko einer Beschädigung, wenn ein anderer Prozess gleichzeitig in das Repository schreibt; siehe „HINWEISE“ unten. --prune ist standardmäßig aktiviert.

Also ja, es besteht ein Risiko. Wenn die Uhren von A und B jedoch einigermaßen synchron laufen und die Ausführung der Git-Befehle, die Sie auf das Repository anwenden, nicht länger als zwei Wochen dauert, würde ich das Risiko des gleichzeitigen Pushens und GCens desselben Repositorys als akzeptabel betrachten.

verwandte Informationen