Frage

ich eine Git-Repository mit vielen Commits habe, die unter keinem bestimmten Zweig sind, kann ich sie git show, aber wenn ich auf der Liste Zweige versuchen, die sie enthalten, meldet er nichts zurück.

Ich dachte, das ist die baumelnden Commits / Baum Ausgabe (als Ergebnis von D-Zweig), so dass ich den Repo beschnitten, aber ich sehe immer noch das gleiche Verhalten nach diesen:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

Kein Ausgang, nichts baumelt (rechts?). Aber das Commit existiert

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

und es ist nicht erreichbar durch jeden Zweig wie

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

gibt keine Ausgabe.

Was genau ist der Zustand dieser begehen? Wie kann ich alle Commits in einem ähnlichen Zustand Liste? Wie kann ich Commits wie die löschen?

War es hilfreich?

Lösung

Kein Ausgang, nichts baumelt (rechts?)

Beachten Sie, dass Commits von Ihrem reflog bezeichnet werden als erreichbar.

Was genau ist der Zustand dieser begehen? Wie kann ich alle Commits mit ähnlichem Zustand Liste

Pass --no-reflogs git fsck davon zu überzeugen, sie Ihnen zu zeigen.

Wie kann ich Commits wie die löschen?

Sobald Ihre reflog Einträge abgelaufen sind, werden diese Objekte dann auch von git gc gereinigt werden.

Ablauf wird durch die gc.pruneexpire, gc.reflogexpire geregelt und gc.reflogexpireunreachable Einstellungen. Vgl git help config .

Die Standardwerte sind alle recht vernünftig.

Andere Tipps

Alle baumelnden Commits entfernen und diejenigen erreichbar von den reflogs dies tun:

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

Aber sicher sein, dass das ist, was Sie wollen. Ich empfehle Ihnen, die man-Seiten lesen, aber hier ist der Kern:

git gcremoves unerreichbare Objekte (Commits, Bäume, Blobs (Dateien)). Ein Objekt ist nicht erreichbar, wenn es nicht Teil der Geschichte einiger Zweig ist. Eigentlich ist es ein bisschen komplizierter:

git gc hat einige andere Dinge, aber sie sind hier nicht relevant sind und nicht gefährlich.

Nicht erreichbar Objekte, die jünger als zwei Wochen sind, werden nicht entfernt, so dass wir --prune=now verwenden, was „nicht erreichbar Objekte entfernen, bevor jetzt erstellt wurden“.

Die Objekte können auch durch die reflog zu erreichen. Während Zweige die Geschichte einiger Projektaufzeichnung reflogs die Geschichte dieser Zweige aufzunehmen. Wenn Sie ändern, Reset usw. Commits aus dem Zweigverlauf entfernt, sondern git hält sie für den Fall, um Sie feststellen, dass Sie einen Fehler gemacht. Reflogs sind ein bequemer Weg, um herauszufinden, was destruktiv (und andere) Operationen auf einem Zweig durchgeführt wurden (oder HEAD), wodurch es leichter rückgängig zu machen, eine destruktive Operation zu machen.

So haben wir auch die reflogs tatsächlich entfernt alles nicht erreichbar von einem Zweig zu entfernen. Wir tun dies, indem --all reflogs abläuft. Wieder hält git ein wenig an die reflogs zu schützen Benutzer, so dass wir wieder sagen, es muss nicht tun, so. --expire-unreachable=now

Da ich hauptsächlich die reflog verwenden von destruktiven Operationen zu erholen I --expire=now in der Regel stattdessen verwenden, die vollständig die reflogs zappt.

Ich hatte das gleiche Problem, auch nach folgenden alle Ratschläge zu diesem Thema:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

Wenn es nicht ein reflog ist und kein Zweig, ... es muß einen Tag

git tag                             # showed several old tags created before the cleanup

Ich entfernte die Tags mit git tag -d <tagname> und umgestrickt die Bereinigung und die alten Commits waren verschwunden.

git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

wahrscheinlich muss nur sein

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

berichten, auch auf Niederlassungen von Fernbedienungen

Ich hatte ein ähnliches Problem. Ich lief git branch --contains <commit>, und es kehrte keine Ausgabe genau wie in der Frage.

Aber auch nach dem Ausführen

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

verpflichten meine war noch zugänglich mit git show <commit>. Das war, weil einer der Commits in seiner Einfamilien- / baumelte „Zweig“ markiert wurde. Ich entfernte den Tag, lief wieder die oben genannten Befehle, und ich war golden. git show <commit> zurück fatal: bad object <commit> - genau das, was ich brauchte. Hoffentlich hilft dies jemand anderes, das als fest war wie ich.

git gc --prune=<date> standardmäßig Prune Objekte älter als zwei Wochen. Sie könnten ein neueres Datum gesetzt. Aber git Befehle, die im Allgemeinen lose Objekte erstellen laufen git gc --auto (die Pflaumen Objekte verlieren, wenn ihre Zahl den Wert der Konfigurationsvariable gc.auto überschreitet).

Sind Sie sicher, dass Sie diese Commits löschen möchten? gc.auto Standardeinstellungen wird sichergestellt, dass die losen Gegenstände eine unzumutbare Menge an Speicher nicht nehmen, und für gewisse Zeit lose Gegenstände Speicherung ist in der Regel eine gute Idee. Auf diese Weise, wenn Sie morgen, dass Ihre gelöschten Zweig realisieren enthalten eine Festschreibung Sie benötigt, können Sie es wiederherstellen.

ich versehentlich auf die gleiche Situation und fand meine stashes Bezug auf die unerreichbare enthalten begehen und damit die mutmaßlich unerreichbar begehen von stashes erreichbar war.

Das war, was ich tat es wirklich unerreichbar zu machen.

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top