Git, wie man den gesamten gelöschten / verschobenen Ordner erkennt

8

Git basiert auf Inhalt und keine Datei, daher verstehe ich das folgende Verhalten, aber ich möchte wissen, ob es eine spezielle Option oder einen Hack gibt, um so etwas zu erkennen:

%Vor%

Wenn ich das Protokoll überprüfe, wird Git mir nicht klar sagen, dass foo gelöscht wurde, aber alle Dateien foo/a.txt und foo/bar/b.txt wurden gelöscht

%Vor%

Wenn ich also folgende Commits anlege:

%Vor%

name-status zwischen commit delete whole dir und delete just 2 files sind ähnlich

%Vor%

Gibt es eine Möglichkeit, Unterschiede zu erkennen, wenn das gesamte Verzeichnis gelöscht wird?

    
Kakawait 08.09.2015, 15:05
quelle

2 Antworten

3

Unter der Annahme einer Beispielbaumstruktur in Ihrem Repository:

%Vor%

Machen wir die folgenden Commits:

%Vor%

-

%Vor%

-

%Vor%

-

Commit 3b53f16eb2fd7d3d605180ccabcfa71eb9e9225a ist derjenige, der sieht, dass der Ordner "a / b / c" verschwindet, da die letzte Datei darin entfernt wird.

Um die SHA # des Commits zu finden, wenn der Ordner a / b / c gelöscht wurde, können Sie den letzten Commit des "a / b / c" -Ordners finden, indem Sie eine Kombination von:

verwenden %Vor%

und

%Vor%

Etwas wie:

%Vor%

Ausgabe:

%Vor%

In Form eines einfachen BASH-Skripts (welches ich deleted.sh nenne, sollte ausführbare Berechtigungen haben):

%Vor%

Verwendung:

%Vor%

Ausgabe:

%Vor%

Wie funktioniert es?

Das erste Commit, das in den Verlauf zurückgeht und keine Dateien in der Baumstruktur enthält, die mit dem Ordnerpfad übereinstimmen, sollte ausreichen.

Das macht das Shell-Skript.

Es iteriert rückwärts im Verlauf, ruft alle SHA # s ab, die mit irgendwelchen Dateien in dem Ordner in Beziehung stehen, und findet dann - unter diesen Commits - den ersten, der keine Dateien hat, die dem angegebenen Pfad entsprechen Git Baum.

Die Tatsache, dass dieses Commit in der Liste zur Inspektion auftaucht, stellt sicher, dass es Änderungen gibt, die den Ordner betreffen.

Die Tatsache, dass keine Dateien mit dem Ordner in der Baumstruktur übereinstimmen (gefilterte "ls-tree" gibt eine leere Zeichenfolge zurück), stellt sicher, dass es sich um die Festschreibung handelt, bei der die letzte Datei in diesem Ordner gelöscht wurde.

    
Dmitri Sologoubenko 08.09.2015, 19:02
quelle
1

Soweit ich weiß, gibt es keinen speziellen git-Befehl, um zu erkennen, ob ein Verzeichnis gelöscht / verschoben wurde.

Wenn jedoch das gesamte Verzeichnis an einen neuen Ort in einem verfolgten Git-Repository verschoben wurde, sollte es im Abschnitt Untracked files: des Befehls git status angezeigt werden. Außerdem werden alle Dateien als gelöscht angezeigt.

Wenn Sie für das gelöschte Verzeichnis erwarten, dass das Verzeichnis nicht mehr existiert, können Sie den Befehl ls ausführen, um zu überprüfen, ob das Verzeichnis tatsächlich entfernt wurde. Wenn das Verzeichnis nicht vorhanden ist, wird es nicht verfolgt.

Wenn das Verzeichnis existiert, aber nichts enthält, wird es auch nicht von git verfolgt. Trotzdem könntest du es versuchen

git ls-files dirName/ --error-unmatch; echo$?

Diese Lösung wurde ursprünglich unter diese StackOverflow-Frage . Der Befehl soll prüfen, ob eine bestimmte Datei von git nachverfolgt wird, aber in diesem Fall überprüft git, ob Dateien vorhanden sind, bei denen dirName Teil des Dateipfads ist. Wenn der Ordner nicht verfolgt wird, wird ein Fehler angezeigt.

    
TheSkinnyHipo 08.09.2015 17:30
quelle

Tags und Links