Git: Was ist ein baumelnder Commit / Blob und woher kommen sie?

148

Ich bin auf der Suche nach grundlegenden Informationen zu baumelnden Commits und Blobs.

Mein Repo scheint in Ordnung zu sein. Aber ich bin git fsckzum ersten Mal gelaufen, um zu sehen, was es getan hat, und ich habe eine lange Liste von "baumelnden Blobs" und ein einziges "baumelndes Commit".

Was sind diese Dinge? Wo kommst du her? Zeigen sie etwas Ungewöhnliches (gut oder schlecht) über den Zustand meines Repos an?

Doub1ejack
quelle

Antworten:

95

Während der Arbeit mit Ihrem Git-Repository werden Sie möglicherweise aus dem Betrieb aussteigen und andere Schritte ausführen, die zu Zwischenblobs führen, und sogar einige Dinge, die Git für Sie tut, um Informationsverlust zu vermeiden.

Schließlich (bedingt gemäß der git gc-Manpage ) wird eine Speicherbereinigung durchgeführt und diese Dinge bereinigt. Sie können es auch erzwingen, indem Sie den Garbage Collection-Prozess aufrufen git gc.

Weitere Informationen hierzu finden Sie unter Wartung und Datenwiederherstellung auf der git-scm-Site.

Ein manueller GC-Lauf wird standardmäßig 2 Wochen vor der Laufzeit dieses Befehls eines Sicherheitsnetzes beendet. Es wird empfohlen, den GC gelegentlich auszuführen, um eine performante Nutzung Ihres Git-Repositorys sicherzustellen. Wie alles andere sollten Sie jedoch verstehen, was es tut, bevor Sie die Dinge zerstören, die für Sie wichtig sein könnten.

vgoff
quelle
10
Es ist also fair zu sagen, dass 1) es sicher ist, diese zu entfernen git gc, wenn ich nicht denke, dass etwas mit meinem Repo nicht stimmt , und 2) ich mir darüber überhaupt keine Sorgen machen muss, da diese baumelnden Teile bereits normal und dumm sind Griff ist sie?
Doub1ejack
7
Das wäre eine faire Einschätzung.
VGoff
9
Jedes Mal, wenn Sie eine Datei hinzufügen, aber nicht genau diese Version der Datei festschreiben, entsteht ein baumelnder Blob. Kein Grund zur Sorge.
Kanton7
7
Doub1ejack - Im Allgemeinen sollten Sie die Speicherbereinigung nicht manuell ausführen. Es ist eine schlechte Angewohnheit, sich darauf einzulassen, und Git sammelt sowieso bei Bedarf Müll. Der Nachteil der manuellen Ausführung besteht darin, dass Sie nicht mehr in der Lage sind, baumelnde Blobs und Commits wiederherzustellen, die Sie jetzt möglicherweise nicht möchten, aber möglicherweise in Zukunft möchten. Sobald Sie die Garbage Collection ausführen, entfernen Sie einige ziemlich leistungsstarke Wiederherstellungsfunktionen von git. Verwenden Sie mit Vorsicht und ausnahmsweise nicht die Regel. --- Lass git einfach sein Ding machen.
Elijah Lynn
95

Dangling Blob = Eine Änderung, die es in den Staging-Bereich / Index geschafft hat, aber nie festgeschrieben wurde. Eine Sache, die bei git erstaunlich ist, ist, dass Sie es jederzeit zurückbekommen können, sobald es dem Staging-Bereich hinzugefügt wurde, da sich diese Blobs wie Commits verhalten, da sie auch einen Hash haben !!

Dangling Commit = Ein Commit, mit dem kein untergeordnetes Commit, Zweig, Tag oder eine andere Referenz direkt verknüpft ist. Sie können diese auch zurückbekommen!

Elijah Lynn
quelle
5
Sollten "Vorfahren" "Nachkommen" lesen? Im Allgemeinen können Sie kein Git-Commit über seine Vorfahren erreichen.
Phil Miller
@ Novelocrat Ich hatte den gleichen Gedanken, ich stimme zu, es sollte wahrscheinlich Nachkommen lesen.
stkent
1
Ich lese immer noch "Aszendenten" in Ihrer Antwort. Es scheint, dass Ihre Ausgabe vom 2. Juli den Tippfehler nicht korrigiert hat.
Iclman
Wie bekommst du einen baumelnden Klecks zurück?
HelloGoodbye
1
@ElijahLynn Du hast recht. Ich denke, ich habe die Diskussionen etwas zu schnell gelesen. Ein Dangling Commit hat keinen Nachkommen / Kind und wird nicht von einem Tag oder Zweig referenziert.
Iclman
44

So entfernen Sie alle baumelnden Commits aus Ihrem Git-Repository von http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

git reflog expire --expire=now --all
git gc --prune=now

Stellen Sie sicher, dass Sie sie wirklich entfernen möchten, da Sie möglicherweise entscheiden, dass Sie sie schließlich benötigen.

qxo
quelle
5
In der Realität sollten die meisten Benutzer dies niemals benötigen, und wenn sie dies tun, handelt es sich wahrscheinlich um einen programmatischen Anwendungsfall. Der durch das Entfernen von Dangling Commits eingesparte Speicherplatz oder die erhöhte Geschwindigkeit ist meiner Meinung nach die Mühe nicht wert.
Elijah Lynn
1
Dies beantwortet eine andere Frage.
Elijah Lynn
5

Ein Dangling Commit ist ein Commit, das nicht mit einer Referenz verknüpft ist, dh es gibt keine Möglichkeit, es zu erreichen.

Betrachten Sie zum Beispiel das folgende Diagramm. Angenommen, wir löschen den Zweig featureX, ohne seine Änderungen zusammenzuführen, dann wird Commit D zu einem baumelnden Commit, da ihm keine Referenz zugeordnet ist. Wäre es in Master zusammengeführt worden, hätten HEAD- und Master-Referenzen auf Commit D hingewiesen, und es würde nicht mehr baumeln, selbst wenn wir featureX gelöscht hätten. Lesen Sie den Hinweis nach dem Diagramm, um dies besser zu verstehen.

Git sammelt automatisch Müll (dh entsorgt) baumelnde Commits. Wir können das verwenden git reflog, um einen Zweig (von baumelnden Commits) wiederherzustellen, der gelöscht wurde, ohne ihn zusammenzuführen. Gelöschte Commits können nur wiederhergestellt werden, wenn sie im lokalen Objektspeicher vorhanden sind. Wenn es Müll gesammelt wurde, können wir ihn nicht wiederherstellen.

Geben Sie hier die Bildbeschreibung ein

HINWEIS : Ein Zweigstellenname, dh eine Zweigstellenbezeichnung, ist tatsächlich ein Verweis auf das letzte Commit für einen Zweig, dh die Spitze des Zweigs. In der obigen Abbildung beziehen sich featureX, master und HEAD lediglich auf bestimmte Commits. FeatureX- und Master-Labels beziehen sich auf die neuesten Commits in ihren jeweiligen Zweigen. HEAD bezieht sich im Allgemeinen auf die Spitze des aktuell ausgecheckten Zweigs (in diesem Fall Master). Wenn Sie ein älteres Commit in Ihrem aktuellen Zweig auschecken, befindet sich HEAD in einem getrennten Zustand, dh es zeigt auf das ältere Commit anstelle des neuesten. Beachten Sie auch, dass HEAD als symbolische Referenz bezeichnet wird, da es tatsächlich auf die aktuelle Verzweigungsbezeichnung zeigt und jede Verzweigungsbezeichnung immer auf die Spitze der Verzweigung zeigt. Unter normalen Umständen verweist HEAD indirekt auf das letzte Commit.

Beachten Sie außerdem, dass Git seinen Commit-Graphen / Verlauf als gerichteten azyklischen Graphen darstellt . Jedes Commit hat einen Verweis auf das übergeordnete Element. Daher zeigen die Pfeile in einem Festschreibungsdiagramm vom untergeordneten Festschreiben zum übergeordneten Festschreiben. Wir benötigen einen Verweis auf das letzte untergeordnete Commit, um die älteren Commits in einem Zweig zu erreichen.

PS - Das obige Diagramm und Verständnis wurde aus diesem kostenlosen Kurs erhalten . Obwohl der Kurs ziemlich alt ist, ist das Wissen immer noch relevant.

MasterJoe2
quelle