97 votes

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

J'ai mon repo @ github. J'ai fait un peu de travail à la maison et je l'ai poussé sur github. Cela a impliqué la suppression de certains fichiers et 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 publié ce qui suit :

git remote update
git checkout HEAD
git pull origin HEAD

Il a supprimé tous les fichiers qu'il aurait dû supprimer, mais pas les répertoires dans lesquels ils se trouvaient.

Deux questions :

  1. Pourquoi n'a-t-il pas supprimé les répertoires ?
  2. Y a-t-il une commande git que je puisse lancer dans l'état actuel pour les supprimer ?

0 votes

C'est vrai, git checkout HEAD ne fait rien, puisque HEAD est une référence pointant vers le commit en cours de check-out. Vous vouliez probablement utiliser master dans les deux cas.

0 votes

En fait, HEAD a tout mis à jour à l'exception de la suppression des répertoires vides. Comme je l'ai dit, je suis nouveau dans Git.

0 votes

Duplicata possible de Comment forcer "git pull" à écraser les fichiers locaux ? Veuillez consulter les réponses qui s'y trouvent si vous souhaitez encore des solutions différentes.

175voto

mipadi Points 135410

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

4 votes

Je suis confus. Alors pourquoi les répertoires ont-ils été supprimés de mon repo GitHub lorsque j'ai commis/transmis des modifications ?

2 votes

Les répertoires de votre copie de travail peuvent avoir contenu des fichiers non suivis (y compris des fichiers non suivis cachés), et donc ils peuvent sembler vides mais ne le sont pas vraiment, donc Git ne les a pas supprimés. git clean le fera, bien sûr.

0 votes

Merci pour la commande. Cela les a nettoyés. Cependant, je ne comprends toujours pas pourquoi elle a supprimé les répertoires lors d'un commit/push mais pas lors d'un checkout/pull. Les répertoires ne contenaient aucun fichier caché ou non caché.

8voto

Yogurtu Points 396

J'ai eu le même problème, dans mon cas sur le service de construction (CI) comme GIT tire tous les fichiers sans nettoyer les dossiers, tous les bin / obj qui ont été précédemment construits par le CI sont sales, donc si je supprime un projet de test, le bin contiendra toujours la DLL et mentionnera des tests qui n'existent pas.

Afin de résoudre ce problème, la commande suivante semble faire l'affaire (du moins pour moi)

git clean -fd -x

où X supprimera tous les fichiers non suivis :

-X Supprimer uniquement les fichiers ignorés par Git. Cela peut être utile pour tout reconstruire à partir de zéro, mais conserver les fichiers créés manuellement.

4voto

Charles Bailey Points 244082

Dans le cadre de la plupart des opérations qui modifient l'arbre de travail (pull, merge, checkout, etc.) git supprimera tous les répertoires rendus vides par cette opération (i.e. git a supprimé le dernier fichier).

git ne supprimera pas les répertoires qui ne sont pas complètement vides, donc si vous avez des fichiers cachés ou ignorés, ce n'est pas parce que git supprime le dernier fichier traqué de ce répertoire ne signifie pas nécessairement que git sera capable de supprimer ce répertoire. git ne considère pas cela comme une condition d'erreur et ne s'en plaindra pas.

0 votes

Mon repo GitHub ne contient pas les répertoires. Lorsque j'ai commis, les répertoires ont été supprimés correctement. Cependant, lorsque je fais un checkout/pull, il ne supprime que les fichiers. Les répertoires sont vides. $ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 Sep 23 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 Sep 30 10:51 ../

1 votes

Je ne suis pas sûr de ce que vous voulez dire par "passer de HEAD à master", je présume que vous voulez dire " git checkout master "mais la plupart des gens se contentent de dire " J'ai basculé vers/ vérifié master ". Quoi qu'il en soit, lorsque git dit " Déjà à jour ", cela signifie qu'il n'a rien fait. git supprime uniquement les répertoires qu'il a fait vide.

0 votes

Mauvaise formulation. J'ai remplacé "HEAD" par "master" comme certaines personnes l'ont suggéré dans les commentaires.

2voto

qwertzguy Points 1021

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

Solution (une fois que vous avez tiré / accéléré / fusionné) :

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

Si vous ne le faites pas stash avant clean vous perdrez tous vos fichiers non suivis (de manière irréversible).

Note : comme cela nettoie aussi tous les fichiers ignorés, vous devrez peut-être relancer certains de vos scripts de construction 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.

-1voto

janko Points 2642

Git ne suit pas les répertoires actuellement (voir wiki git ), c'est-à-dire que vous ne pouvez pas ajouter de répertoires vides et que git ne supprimera pas les répertoires qui se retrouvent vides. (EDIT : Merci, Manni, j'avais tort ! Tu ne peux pas ajouter répertoires vides, mais git va supprimer les répertoires qui deviennent vides parce que leur contenu suivi a été supprimé. )

Quant à la commande pour supprimer les répertoires vides : cela dépend de votre système d'exploitation.

Pour Linux, vous pourriez utiliser, par exemple,

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

Cependant, cela supprimera tous des répertoires vides !

1 votes

La page wiki indique que git ne crée pas de répertoires vides pour vous. Il le fait no dire qu'il ne supprimera pas les répertoires vides. Ce que mculp veut fonctionne pour moi.

0 votes

@janko, En fait, git n'a pas réussi à supprimer un répertoire complètement vide pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X