git - wie entferne ich einen leeren Ordner und drücke diese Änderung?

75

Wie kann ich einen leeren Ordner lokal entfernen und dies auch für andere Mitarbeiter tun, die die Fernbedienung per Pull-Push freigeben? Ich weiß, dass Ordner in diesem Sinne nicht von Git "verfolgt" werden, aber die Frage bleibt.

Beispiel: Ich habe eine Datei in einen anderen Ordner verschoben und die Änderung (des Umzugs) festgeschrieben.

Aber ich kann git rm nameden Ordner nicht, da ich bekomme, dass "nicht übereinstimmt" git rmdir namenicht existiert.

Ich kann ein machen, git clean -f folderaber wie wird das hochgeschoben?

Ich kann rmdie Datei direkt bearbeiten, aber wie kann ich das Entfernen des Verzeichnisses korrekt durchführen und es in das Repository und dann an andere weiterleiten, wenn sie es ziehen, damit ihr vorhandener Ordner gelöscht wird?

Michael Durrant
quelle
1
Was meinst du, die Frage bleibt?
Manojlds

Antworten:

121

Die kurze Antwort: Sie können keine Änderungen an Verzeichnissen (hinzugefügt, entfernt usw.) vornehmen, da Git Verzeichnisse nicht selbst verfolgt .

Laut FAQ :

Derzeit erlaubt das Design des Git-Index (Staging-Bereich) nur das Auflisten von Dateien, und niemand, der kompetent genug ist, um die Änderung vorzunehmen, um leere Verzeichnisse zuzulassen, hat sich genug um diese Situation gekümmert, um Abhilfe zu schaffen.

Verzeichnisse werden automatisch hinzugefügt, wenn Dateien hinzugefügt werden. Das heißt, Verzeichnisse müssen niemals zum Repository hinzugefügt werden und werden nicht einzeln verfolgt.

Für Git existiert Ihr leeres Verzeichnis nicht mehr.

Ich habe festgestellt, dass die Gewohnheit, git clean -fdVerzeichnisse zu verwenden, das Entfernen von Verzeichnissen überflüssig macht. Sie git cleankönnen jedoch Elemente entfernen, die möglicherweise nicht entfernt werden sollen (einschließlich neuer Dateien, die Sie noch nicht festgeschrieben haben). Daher verwende ich in der Regel zuerst, um git clean -fdnzu sehen, was entfernt wird , wenn ich den Befehl verwende.

Es sieht so aus, als ob Sie gezwungen sein könnten, mit Ihren Entwicklerkollegen zu sprechen, um dieses Verzeichnis zu bereinigen.

Jake Greene
quelle
Mercurial hat einen gesünderen Ansatz hier - das Verzeichnis zu entfernen , wenn leer: stackoverflow.com/a/3917322/913223 und superuser.com/questions/81204/...
Daniel Sokolowski
1
Diese Antwort ist unvollständig. Das git svn fetchverwaltet leere Ordner. Auch git svn rebaseleere Ordner neu erstellen , wenn nur eine entfernen.
Andry
@ DanielSokolowski, ist das der gleiche Ansatz in Git, zumindest beim Klonen eines Repos. Ich habe festgestellt, dass git beim Klonen eines Repos mit einem leeren Verzeichnis das leere Verzeichnis nicht erstellt. Ist das nicht ein großes Problem, denn jetzt muss ich überprüfen, ob das Verzeichnis zum Schreiben von Dateien vorhanden ist?
Alpha_989
7
git add --all
git clean -f -d
git commit -m "trying to remove folders"
git push
Ekhtiar
quelle
Gibt es eine Möglichkeit, dies zu erreichen, ohne Änderungen vornehmen und vorantreiben zu müssen?
Benjamin John
-1

Sie können keine leeren Ordner verschieben. Wenn Sie jedoch leere Ordner in Ihrem geklonten / lokalen Repo bereinigen möchten, übernehmen Sie Ihre letzten Änderungen. Löschen Sie dann einfach alle Dateien außer dem .git-Ordner in Ihrer lokalen Kopie. Setzen Sie dann alle Änderungen erneut zurück, wodurch alle Dateien zurückgesetzt werden, aber die leeren Verzeichnisse, die nicht verfolgt werden, weggelassen werden.

Reich
quelle
1
Oder verwenden Sie einfachgit clean -fd
Aaron Franke
-9

Ein etwas hackiger Weg, dies zu umgehen, besteht darin, eine gefälschte Datei im Verzeichnis zu erstellen, sie festzuschreiben und dann zu entfernen. Durch Entfernen wird auch das Verzeichnis entfernt. Erstellen Sie also name / fake.txt

git add name/fake.txt
git commit -m "message"
git rm name/fake.txt
git commit -m "message2"
Graeme Hunter
quelle
3
Dieser Ansatz funktioniert zwar, aber im zweiten Schritt, wenn Sie den Ordner mit der Datei löschen rm -rf nameund dann die Änderung
festschreiben möchten
2
schafft unnötige Commits
Joel