50 votes

Git supprime-t-il les dossiers vides ?

J'ai supprimé tous les fichiers d'un répertoire dans mon dossier de travail, mais le répertoire lui-même existe toujours. Après avoir transféré les modifications dans un dépôt distant ( GitHub ) J'ai vérifié mon projet et j'ai remarqué que le répertoire avait disparu. Est-il possible que Git supprime les dossiers vides ?

99voto

slhck Points 209720

Pourquoi le répertoire n'est-il pas affiché ?

Git ne suit pas les répertoires ; il ne suit que les fichiers.

S'il n'y a pas de fichiers dans un répertoire, ce répertoire n'existe pas pour Git lors de l'ajout ou de la suppression de fichiers. En particulier, un répertoire disparaîtra de l'index de Git lorsque vous aurez supprimé tous les fichiers qu'il contient et que vous aurez ajouté cette modification à l'index. Vice-versa, un répertoire ne sera pas ajouté via git add s'il est vide.

En d'autres termes : Si vous pouvez voir le répertoire localement dans votre navigateur de fichiers, mais qu'il a disparu de GitHub, vous avez très probablement supprimé tous les fichiers du répertoire, ajouté cette modification à l'index, et l'avez validée et poussée.

Comment suivre un répertoire vide, alors ?

Si vous souhaitez suivre explicitement un répertoire vide, vous devez y créer un fichier. Puisque Git ne suit pas les répertoires vides, vous devez l'inciter à le faire en ajoutant un fichier dans le répertoire à l'index de Git.

En général, les personnes stockent un fichier appelé .gitkeep dans un répertoire qu'ils souhaitent suivre, mais où le répertoire doit rester vide pour le moment. Vous pouvez donner au fichier cualquier autre nom, bien sûr, mais le nom .gitkeep est une convention. Les .gitkeep (en raison du fait qu'il commence par un . ) n'apparaîtra pas dans les listes de fichiers de la plupart des systèmes.

Au lieu de .gitkeep certains utilisateurs aiment aussi mettre un README à la place, idéalement avec une courte description de la raison pour laquelle le répertoire doit exister en premier lieu.

Exemple

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

Ici, le foo n'est ajouté à l'index que lorsqu'un fichier s'y trouve.

Et si je vraiment vous voulez suivre un répertoire vide ?

Cela dit, en principe, la structure de données sous-jacente permet à Git de stocker un répertoire vide, puisqu'il serait représenté par un "arbre" vide. Quelques lectures complémentaires aquí y aquí .

7voto

sunknudsen Points 660

Ajouter ce qui suit .gitignore aux dossiers que vous souhaitez inclure dans votre répertoire.

# Ignore everything in this directory
*
# Except this file
!.gitignore

Ajout .gitkeep fonctionne mais n'est pas une solution officielle. Voir aussi https://stackoverflow.com/questions/7229885/what-are-the-differences-between-gitignore-and-gitkeep

2voto

Git ne suit pas les dossiers. Afin de ne pas accumuler les problèmes, lorsque l'index passe (indirectement) du référencement d'un répertoire au non-référencement (en faisant quelque chose comme git rm sur le dernier fichier enregistré dans le répertoire), Git essaie de supprimer le répertoire avant de perdre sa trace parce qu'il n'est plus dans l'index. Si Git réussit parce que le répertoire est effectivement devenu vide (et ne contient pas de fichiers non enregistrés), le répertoire disparaîtra, sinon, il restera dans les parages puisque Git n'en a plus connaissance.

1voto

Alve Points 1077

Git peut supprimer des dossiers si vous exécutez git clean con -dffx (éventuellement même avec un sous-ensemble de ces options).

Comme @TRiG le mentionne dans les commentaires, si le répertoire est vide lorsque vous commit, il n'apparaîtra pas, par exemple, dans GitHub, car git ne suit pas les répertoires (il suit les fichiers) - l'arbre où se trouvaient ces fichiers n'est plus pertinent car il n'y a pas de fichiers, donc il n'y a pas d'arbre.

Sans plus de détails, il nous est pratiquement impossible de répondre correctement à vos questions sous-jacentes ( que s'est-il passé ? ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X