2016-04-27 9 views
2

Ich habe einen einzigen Commit am Anfang meines Master-Zweigs, der eine .gitignore Datei enthält.Der Schalter --prune-empty für git filter-branch beschneidet leeres Commit nicht am Anfang des Zweigs

Wenn ich laufen

git filter-branch -f --tree-filter 'git rm .gitignore' --prune-empty 

Der neue Baum noch, dass der Knoten enthält, obwohl leer gemacht (die .gitignore Datei entfernt wurde), so die Hälfte der Arbeit ist.

Warum hat --prune-empty den leeren Commit nicht gelöscht? Oder habe ich diesen Schalter falsch verstanden?

Antwort

3

Die prune-empty Option von git filter-branch nicht erwähnt:

dieser Schalter nur für Commits gilt, dass ein und nur ein Elternteil haben

Wenn Ihr geändertes begehen wurde „am Anfang des master Zweig ", es hat 0 Eltern.
Diese besondere Commit, auch leer, wird nicht beschnitten werden.


Wenn Sie geändert wurde commit "am Anfang eines Zweigs",

beginning of a branch b 
    | 
    v 
--x--Y--z--z 
     \ 
     b--b 

it should be pruned nur, wenn dieser leer begehen ist identisch mit dem vorherigen begehen.

Als torekmentions here: *

ein „leeres commit“ ist wirklich eine, die den gleichen Baum wie die vorherige hat begehen: Es ist nicht, dass es überhaupt keine Dateien hat, dann ist es, dass es alles hat die gleichen Dateien, mit den gleichen Modi und den gleichen Inhalten wie die Eltern-Commits.
Dies liegt daran, dass git vollständige Snapshots für jedes Commit speichert, nicht Unterschiede von einem Commit zum nächsten.

Wie der doc sagt:

Irgendeine Art von Filter leer Commits generieren, dass den Baum unberührt gelassen.

So ein Commit mit „0 Dateien“ ist nicht ein „leeres commit“ aus der Sicht der Filter-Zweig, es sei denn, die Eltern verpflichten auch hat „0 Dateien“ (dh die gleiche empty "semi-secret" tree)

+0

Titel geändert, hinzugefügt ... am Anfang der Verzweigung. –

+1

@ AndersLindén Ich habe die Antwort bearbeitet, um den Fall "Anfang eines Zweigs" zu adressieren, was mich dazu brachte, den Begriff "leeres Commit" erneut zu betrachten. – VonC

+0

Es scheint wie das Commit, das nur die .gitignore-Datei vor dem Git-Filter-Zweig hatte ist jetzt in allen Sinnen leer. Aber Sie haben darauf hingewiesen, dass "dieser Schalter nur für Commits gilt, die nur einen Elternteil haben". Sollte die Funktion nicht geändert werden auf "Dieser Schalter gilt nur für Commits mit einem Elternteil oder ist der initiale Commit"? –