Git checkout / pull entfernt keine Verzeichnisse?

82

Ich habe mein Repo @ Github. Ich habe zu Hause gearbeitet und es auf Github geschoben. Dabei wurden Dateien und Verzeichnisse gelöscht. Jetzt bin ich auf meiner Arbeitsbox, die eine Kopie des Codes hatte, bevor die Dateien und Verzeichnisse gelöscht wurden.

Ich habe folgendes ausgegeben:

git remote update
git checkout HEAD
git pull origin HEAD

Es löschte alle Dateien, die es haben sollte, aber nicht die Verzeichnisse, in denen sich die Dateien befanden.

Zwei Fragen:

  1. Warum wurden die Verzeichnisse nicht entfernt?
  2. Gibt es einen Git-Befehl, den ich im aktuellen Status ausgeben kann, um sie zu entfernen?
mculp
quelle
Einverstanden, Git Checkout HEAD macht nichts, da HEAD ein Ref ist, der auf das aktuell ausgecheckte Commit verweist. Sie wollten wahrscheinlich in beiden Fällen den Meister.
Cascabel
Nun, HEAD hat tatsächlich alles aktualisiert, mit Ausnahme des Löschens der leeren Verzeichnisse. Wie ich schon sagte, ich bin neu in Git.
mculp
Mögliches Duplikat von Wie erzwinge ich "git pull", um lokale Dateien zu überschreiben? Bitte überprüfen Sie die Antworten dort, wenn Sie noch andere Lösungen wünschen.
DrBeco

Antworten:

151

Git verfolgt keine Verzeichnisse und entfernt daher keine Verzeichnisse, die aufgrund einer Zusammenführung oder einer anderen Änderung leer werden. Sie können jedoch verwenden git clean -fduntracked Verzeichnisse (die entfernen , um -fdMarkierungsmittel f orce Entfernung von untracked Dateien und d irectories).

Mipadi
quelle
4
Ich bin verwirrt. Warum wurden die Verzeichnisse dann aus meinem GitHub-Repo gelöscht, als ich Änderungen festgeschrieben / gepusht habe?
mculp
1
Die Verzeichnisse in Ihrer Arbeitskopie enthielten möglicherweise nicht verfolgte Dateien (einschließlich versteckter nicht verfolgter Dateien), und daher scheinen sie leer zu sein, sind es aber nicht, also hat Git sie nicht entfernt. git cleanwird natürlich.
Mipadi
4
Es hat möglicherweise etwas mit der Tatsache zu tun, dass GitHub-Repos reine Repositorys sind (sie haben keine Arbeitskopien), aber Ihr lokales Repositorys. Ich stelle mir vor, wenn Sie ein neues Repo vom GitHub-Ursprung geklont hätten, hätten Sie diese Verzeichnisse nicht.
Mipadi
18
Führen Sie den Befehl jedoch natürlich zuerst mit -n(Trockenlauf) aus -f, damit Sie sehen können, was gelöscht werden soll. Zumal git clean -dnicht nur diese problematischen Verzeichnisse, sondern auch nicht verfolgte Dateien entfernt werden.
Todd Owen
2
@EliGolin: Löscht git cleankeine in .gitignore aufgelisteten Dateien, es sei denn, Sie übergeben die -xOption.
Mipadi
4

Als Teil der meisten Operationen, die den Arbeitsbaum ändern (ziehen, zusammenführen, auschecken usw.), entfernt git alle Verzeichnisse, die durch diese Operation leer gemacht werden (dh git hat die letzte Datei entfernt).

git entfernt keine Verzeichnisse, die nicht vollständig leer sind. Wenn Sie also Dateien ausgeblendet oder ignoriert haben , bedeutet dies nicht unbedingt, dass git dieses Verzeichnis entfernen kann, nur weil git die zuletzt verfolgte Datei aus diesem Verzeichnis entfernt. git betrachtet dies nicht als Fehlerbedingung und beschwert sich daher nicht darüber.

CB Bailey
quelle
Mein GitHub-Repo hat keine Verzeichnisse. Beim Festschreiben wurden die Verzeichnisse korrekt entfernt. Beim Auschecken / Ziehen werden jedoch nur die Dateien entfernt. Die Verzeichnisse sind leer. $ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 23. September 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30. September 10:51 ../
mculp
1
Ich bin mir nicht ganz sicher, was Sie unter "HEAD auf Master umgestellt" verstehen, ich nehme an, Sie meinen " git checkout master", aber die meisten Leute würden einfach sagen "Ich habe auf Master umgeschaltet / ausgecheckt". Wie auch immer, als Git sagte: "Schon auf dem neuesten Stand." es bedeutet, dass es nichts getan hat. git entfernt nur Verzeichnisse, die es leer macht .
CB Bailey
Schlechte Formulierung. Ich habe "HEAD" in "master" geändert, wie einige Leute in den Kommentaren vorgeschlagen haben.
mculp
@ CharlesBailey, was du gesagt hast, ist nicht das, was ich sehe. git checkouthat kein vollständig leeres Verzeichnis entfernt.
Acumenus
@ABB: Git entfernt nur Verzeichnisse, die durch einen Checkout-Vorgang leer gemacht werden. Ich habe das noch einmal getestet; es funktioniert noch.
CB Bailey
2

Git verfolgt keine Verzeichnisse, Dateien (mit ihrem Pfad). Git erstellt alle Verzeichnisse für diese Pfade, wenn sie noch nicht vorhanden sind (cool!), Löscht sie jedoch nicht , wenn alle in einem Pfad enthaltenen Dateien verschoben oder gelöscht werden (nicht cool ☹ ... aber es gibt Gründe).

Lösung (sobald Sie gezogen / vorgespult / zusammengeführt haben):

git stash --include-untracked
git clean -fd
git stash pop

Wenn Sie dies nicht stashvorher tun clean, verlieren Sie alle Ihre nicht verfolgten Dateien (irreversibel).

Hinweis: Da hierdurch auch alle ignorierten Dateien bereinigt werden, müssen Sie möglicherweise einige Ihrer Build-Skripte erneut ausführen, um Projektmetadaten neu zu erstellen (z ./gradlew eclipse. B. :) . Dadurch werden auch leere Verzeichnisse gelöscht, die niemals Teil der Pfade von Git-Dateien waren.

qwertzguy
quelle
2

Ich hatte das gleiche Problem, in meinem Fall beim Build Service (CI). Da GIT alle Dateien ohne Bereinigungsordner abruft, sind alle Bin / Obj, die zuvor vom CI erstellt wurden, verschmutzt. Wenn ich also ein Testprojekt entferne, wird der Bin enthält weiterhin die DLL und erwähnt Tests, die nicht vorhanden sind.

Um dieses Problem zu lösen; Dieser Befehl scheint den Trick zu tun (zumindest für mich)

git clean -fd -x

Dabei entfernt X alle nicht verfolgten Dateien:

-X Entferne nur Dateien, die von Git ignoriert werden. Dies kann nützlich sein, um alles von Grund auf neu zu erstellen, aber manuell erstellte Dateien beizubehalten.

Yogurtu
quelle
-1

Git verfolgt derzeit keine Verzeichnisse (siehe Git-Wiki ), dh Sie können weder leere Verzeichnisse hinzufügen, noch wird Git Verzeichnisse entfernen, die leer enden. (EDIT: Danke, Manni, ich habe mich geirrt! Sie können keine leeren Verzeichnisse hinzufügen , aber git entfernt Verzeichnisse, die leer werden, weil ihr verfolgter Inhalt gelöscht wurde. )

Der Befehl zum Entfernen der leeren Verzeichnisse hängt von Ihrem Betriebssystem ab.

Für Linux könnten Sie zB verwenden

find -depth -type d -empty -exec rmdir {} \;

Dadurch werden jedoch alle leeren Verzeichnisse entfernt!

Janko
quelle
1
Die Wiki-Seite sagt, dass Git keine leeren Verzeichnisse für Sie erstellt. Es heißt nicht , dass leere Verzeichnisse nicht gelöscht werden. Was mculp will, funktioniert für mich.
InnaM
@janko, Eigentlich konnte git kein komplett leeres Verzeichnis für mich entfernen.
Acumenus