5
votes

Comment trouver tous les dossiers vides et les fichiers non suivis lors de l'utilisation de git?

Sur la base de cet article et de cet article ,
git ls-files --others --exclude-standard peut lister tous les fichiers non suivis.
Mais je le teste, je ne peux pas lister les dossiers vides (à la fois suivis et non suivis).

Par exemple, impossible de répertorier le dossier d' archiver folder vide comme ci-dessous:

.
├── admin.php
├── api
│   ├── index.htm
│   └── remote
│       └── mod
│           ├── index.htm
│           ├── mod_cron.php
│           └── mod_index.php
└── archiver folder

Alors ma question est: comment lister tous les fichiers non suivis et les dossiers vides ?


1 commentaires

Notez que git ne suit pas les dossiers.


3 Réponses :


3
votes

TL; DR: recherchez simplement les répertoires vides. Vous pouvez les supprimer en toute sécurité - eh bien, «safe» dépend de votre propre logiciel, mais en ce qui concerne Git , c'est sûr. (Faites attention aux fichiers manquants - voyez la définition de «manquant» ci-dessous - ce qui peut supprimer un répertoire que Git voudra peut-être plus tard, mais c'est en quelque sorte OK, car Git le créera à nouveau.)

Sur un système Unix / Linux (édité pour corriger le mot perdu dans la transcription):

find . -name .git -prune -o -type d -empty -print

(au niveau supérieur de l'arbre de travail) trouvera les répertoires vides.

Assez long)

Git n'est pas intéressé par les dossiers / répertoires. Il n'y a pas de dossier non suivi de la même manière qu'il n'y a pas de dossier suivi: Git ne se soucie que des fichiers . Plus précisément, un fichier se trouve soit dans l'index, soit pas dans l'index, et s'il n'est pas dans l'index, il n'est pas suivi.

Lorsque vous utilisez les différentes options pour répertorier les fichiers non suivis (qui ont tendance à ignorer ceux qui ne sont pas suivis et ignorés puisque vous le souhaitez normalement), Git regroupera parfois tous les fichiers qui se trouvent dans un dossier, notez qu'il y a il n'y a pas de fichiers suivis dans ce dossier et signalez-les en utilisant la notation agrégée. Vous pouvez arrêter cela avec, par exemple, git status --untracked-mode=all ; alors vous obtiendrez les noms de fichiers individuels.

Notez qu'il est possible d'avoir un fichier suivi, mais manquant . Par exemple, supposons que sub/README.txt est un fichier suivi et existe réellement. Ensuite, nous rm sub/README.txt . Le fichier sub/README.txt reste dans l'index de Git, et sera dans le prochain commit, mais il est manquant. Si c'était le seul fichier de sub dans votre arbre de travail, sub est maintenant vide et vous pouvez le supprimer avec rmdir sub . Même si sub/README.txt reste manquant (et sub est également absent!), Cela n'affecte pas le prochain commit: il contiendra toujours sub/README.txt , car ce fichier est dans l'index. (En utilisant git rm --cached sub/README.txt , vous pouvez également le supprimer de l'index, si c'est ce que vous vouliez.)

Si et quand Git va recopier sub/README.txt de l'index dans l'arbre de travail, Git découvrira à ce stade qu'il n'y a pas de sub . Git haussera simplement les épaules métaphoriques et créera le répertoire sub , puis y mettra sub/README.txt . C'est pourquoi Git ne s'intéresse pas aux dossiers / répertoires: ils sont juste ennuyeux et ennuyeux, nécessaires uniquement lorsqu'ils sont nécessaires pour contenir des fichiers, créés à la demande.

Si vous voulez que Git crée un répertoire, vous devez y stocker un fichier. Puisque les programmes gérés par Git doivent pouvoir ignorer le fichier nommé .gitignore , c'est un très bon nom de fichier à coller dans un tel répertoire. Vous pouvez écrire * dans ce fichier et l'ajouter à vos commits, afin que Git crée le répertoire et y écrive un fichier .gitignore contenant * , et ignorera ainsi automatiquement tous les fichiers supplémentaires non suivis dans ce répertoire.

Note Côté: En général, quand Git tire le dernier fichier sur un répertoire, il supprimera le répertoire aussi, mais parfois je l' ai vu laisser un peu derrière. (Bien sûr, il doit laisser le répertoire derrière s'il contient encore des fichiers non suivis. Notez que git clean -fd supprimera les répertoires vides, bien qu'il supprime également les fichiers non suivis.)


7 commentaires

Par exemple, il y a un dossier vide upload_resource , git ignorez-le mais nous avons besoin de ce dossier vide.Ce dossier vide doit être dans le serveur de production, les utilisateurs peuvent alors télécharger des fichiers dans ce dossier.


Si vous souhaitez utiliser Git pour stocker une arborescence de répertoires que vous déploierez ailleurs sur un serveur et qu'un fichier .gitignore n'est pas suffisant, n'utilisez pas Git comme outil de déploiement. Utilisez quelque chose d'autre qui mettra les bons fichiers en place et créera les répertoires vides dont vous avez besoin.


oui, j'utilise rsync pour déployer des dossiers vides, mais comment list empty folders ?


Eh bien, avec find , utilisez le prédicat -empty . C'est également vrai pour les fichiers vides, alors find . -name .git -prune -o -d -empty -print trouvera les répertoires réellement vides.


Créez simplement un fichier dans le dossier. Je l'appelle généralement .keep . Ensuite, vous pouvez le valider.


@kittygirl: qu'entendez-vous par "mauvais résultat"? find (GNU findutils) 4.7.0-git : find --version => find (GNU findutils) 4.7.0-git ; mkdir empty et ensuite le find => ./empty ; rmdir empty et répéter la recherche, pas de sortie. ... Oh! Gah, j'ai perdu le -type dans la transcription!


@ torek, maintenant, votre script n'a aucun avertissement ou erreur.



1
votes
git ls-files --others --exclude-standard> not_tracked
find . -depth -empty -type d \( ! -regex '.*/\..*' \) >> not_tracked
Please check my answer,I spent 2 days for it.

0 commentaires

0
votes

La commande git clean fait exactement ce que vous voulez.


0 commentaires