4 Stimmen

Wie erhalte ich eine Liste der Verzeichnisse, die in meinem Git-Repository gelöscht wurden?

Ich muss eine Liste von Änderungen in einem Git-Repository über einen Zeitraum generieren. Dazu habe ich die Commit-ID notiert und vergleiche sie mit dem aktuellen HEAD, um die Liste der Änderungen in einem Git-Repository zu generieren. Zum Beispiel:

$ git diff --name-status OLD_COMMIT..HEAD

Dies liefert eine Liste der Modifikationen in einem Git-Repository.

Aber vor kurzem habe ich einen Fehler in diesem Ansatz bemerkt, da er das gelöschte Verzeichnis nicht auflistet. Obwohl er die gelöschten Dateien korrekt auflistet.

Wie kann ich eine korrekte Liste der Löschungen in einem Git-Repository erhalten? (Denn wenn das gelöschte Verzeichnis aufgelistet werden könnte, ist klar, dass alle Dateien darin gelöscht wurden. Daher wird es keine lange Liste von gelöschten Dateien geben, sondern eine einzelne Zeile, die das gelöschte Verzeichnis zeigt!!!)

7voto

CB Bailey Punkte 693084

git verfolgt Baumobjekte, die seine Darstellung von Verzeichnissen sind. Auch wenn es aus einer objektorientierten Modellperspektive technisch möglich ist, speichert git keine leeren Bäume. Stattdessen entfernt git jeden Eintrag für einen leeren Baum aus seinem übergeordneten Baum.

Der Befehl git diff-tree erzeugt eine Ausgabe, die zeigt, wie sich alle Baum-Einträge zwischen zwei Bäumen geändert haben.

git diff-tree origin/master master

Dies gibt aus, wie sich alle Einträge im gegebenen Baum (d.h. dem Wurzelbaum des gegebenen Commits in diesem Beispiel) geändert haben.

Das Format wird in der git-diff-tree man page beschrieben, aber im Grunde hat jedes Verzeichnis, das erstellt oder entfernt wurde, 040000 in der zweiten oder ersten Spalte und 000000 in der ersten oder zweiten Spalte. Dies sind die Baum-Eintrag 'Modi' für die linken und rechten Einträge.

Wenn Sie rekursiv nach Baum-Einträgen in Unterbäumen suchen möchten, müssen Sie die Option -t verwenden und nicht nur die Option -r, denn standardmäßig zeigt -r die Unter-Einträge eines Baums anstatt des Baum-Eintrags selbst an, -t zeigt beides an.

Wenn Sie an Verzeichnissen interessiert sind, die sich geändert haben (hinzugefügt oder gelöscht wurden, oder von einem anderen Typ zu oder von einem anderen Typ geändert wurden - z.B. Symlink) und nicht nur an unterschiedlichen Inhalten, dann müssen Sie wahrscheinlich Einträge filtern, die mit :040000 040000 beginnen.

Hier ist ein möglicher Befehlszeilenbefehl, der das macht.

git diff-tree -t origin/master master | grep 040000 | grep -v -E '^:040000 040000'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X