2017-06-26 3 views
0

Ich habe ein Gewinde C-Programm, das git gc über popen in einem Pthread neben der Hauptanwendung startet. Der Hauptthread startet andere Git-Befehle.Git - darf der Garbage Collector parallel laufen?

Es gibt keine Probleme für die meisten anderen Git-Befehle, außer wenn ich über git commit -m "msg" committe.

Aus irgendeinem Grund, während es Commit ist und dann der andere Thread versucht, den Garbage Collector parallel auszuführen, stürzt die Anwendung ab.

scheint jedoch über git gc &! git commit -m "msg" & zugleich auf dem Terminal ein git commit und ein git gc tun die meiste Zeit zu arbeiten, aber ein paar Mal der Commit-Prozess beendet mit Exit-Code 128

Vielleicht ist das Problem? Wie stelle ich sicher, dass der Garbage Collector erfolgreich parallel ausgeführt wird? Soll der Garbage Collector parallel ausgeführt werden?

ich diese Mailing-Liste Thread auch gefunden, aber es scheint nicht zu informativ zu sein: https://dev.eclipse.org/mhonarc/lists/jgit-dev/msg02138.html

+3

Warum starten Sie 'git gc'? – CodeWizard

+0

@CodeWizard Da ich den Repo optimieren muss, damit die anderen Befehle schneller sind, führe ich alle 30 Minuten –

+1

Ich weiß nicht über die Multithreading-Fähigkeiten von GIT, aber wenn es nur der GC-Befehl ist, warum nicht Sie Verwenden Sie eine [Lese-/Schreibsperre] (https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock)? Exklusive Sperre für GC, gemeinsame Sperre für alle anderen Operationen? – Aconcagua

Antwort

1

Es sei denn, Sie VIEL von git Manipulationen wie git commit --amend oder git rebase oder die Schaffung einer Menge von Objekten zu tun, Starten git gc so oft ist nutzlos. Bitte werfen Sie einen Blick auf den git gc NOTES:

Auf der anderen Seite, wenn git gc läuft gleichzeitig mit einem anderen Verfahren, die Gefahr besteht, da ist es ein Objekt zu löschen, dass der andere Prozess verwendet wird, sondern erstellt einen Verweis auf . Dies kann dazu führen, dass der andere Prozess fehlschlägt oder das Repository beschädigt wird, wenn der andere Prozess später einen Verweis auf das gelöschte Objekt hinzufügt.

Vielleicht anstatt git gc parallel zu starten, sollten Sie es nur an Ihre Bedürfnisse anpassen? Die Konfiguration erfolgt mit git config gc.*, insbesondere gc.auto.

+0

Beachten Sie auch, dass wenn man 'git gc' automatisch im Hintergrund startet, man es als' git gc --auto' laufen lassen sollte. Dadurch wird der übliche 14-tägige (oder anderweitig konfigurierte) Kulanzzeitraum eingerichtet, um das oben genannte Problem zu vermeiden. – torek

Verwandte Themen