web-dev-qa-db-fra.com

Git checkout / pull ne supprime pas les répertoires?

J'ai mon repo @ github. J'ai fait du travail à la maison et je l'ai poussé vers github. Cela impliquait une suppression des fichiers et des répertoires. Maintenant, je suis sur ma boîte de travail, qui avait une copie du code avant de supprimer les fichiers et les répertoires.

J'ai délivré ce qui suit:

git remote update
git checkout HEAD
git pull Origin HEAD

Il a supprimé tous les fichiers qu'il devait contenir, mais pas les répertoires dans lesquels ils se trouvaient.

Deux questions:

  1. Pourquoi n'a-t-il pas supprimé les répertoires?
  2. Existe-t-il une commande git que je peux émettre dans l'état actuel pour les supprimer?
76
mculp

Git ne suit pas les répertoires, il ne supprimera donc pas ceux qui deviennent vides à la suite d'une fusion ou d'une autre modification. Cependant, vous pouvez utiliser git clean -fd pour supprimer les répertoires non suivis (le -fd flag signifie f suppression orce des fichiers non suivis et d répertoires).

146
mipadi

Dans le cadre de la plupart des opérations qui modifient l'arborescence de travail (extraction, fusion, extraction, etc.), git supprimera tous les répertoires vides par cette opération (c'est-à-dire que git a supprimé le dernier fichier).

git ne supprimera aucun répertoire qui ne soit pas complètement vide, donc si vous avez des fichiers cachés ou ignorés, ce n'est pas parce que git supprime le dernier fichier tracked de ce répertoire que git sera capable de supprimer ce répertoire. git ne considère pas cela comme une condition d'erreur, donc ne s'en plaindra pas.

3
CB Bailey

Git ne suit pas les répertoires, les fichiers (avec leur chemin). Git crée tous les répertoires de ces chemins s'ils n'existent pas encore (cool!), Mais il ne les supprime pas si tous les fichiers contenus dans un chemin est déplacé ou supprimé (pas cool ☹ ... mais il y a des raisons).

Solution (une fois que vous avez tiré/avancé/fusionné):

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

Si vous n'avez pas stash avant clean, vous perdrez tous vos fichiers non suivis (de manière irréversible).

Remarque: étant donné que cela supprime également tous les fichiers ignorés, vous devrez peut-être réexécuter certains de vos scripts de génération pour recréer les métadonnées du projet (ex: ./gradlew Eclipse). Cela supprime également les répertoires qui sont vides et qui n'ont jamais fait partie des chemins des fichiers git.

2
qwertzguy