823 votes

Commande Git pour afficher quels fichiers spécifiques sont ignorés par .gitignore

Je me lance dans Git et j'ai le problème suivant :

Ma structure de projet :

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

J'ai du code (actuellement MEF) dans ma branche vendor que je vais compiler là-bas, puis déplacer les références dans /src/refs d'où le projet les récupère.

Mon problème est que mon fichier .gitignore est configuré pour ignorer les fichiers *.dll et *.pdb. Je peux utiliser git add -f bar.dll pour forcer l'ajout du fichier ignoré, ce qui est ok, le problème est que je ne sais pas comment lister les fichiers qui sont ignorés.

Je veux lister les fichiers ignorés pour m'assurer de ne pas oublier de les ajouter.

J'ai lu la page de manuel sur git ls-files et je n'arrive pas à le faire fonctionner. Il me semble que git ls-files --exclude-standard -i devrait faire ce que je veux. Qu'est-ce que je rate ?

13 votes

Ces jours-ci, vous n'utiliseriez pas `git-ls-files` mais plutôt `git ls-files`.

7 votes

Je vous supplie de vérifier la réponse de riyad comme correcte car c'est la seule qui admet qu'il n'y a pas de manière garantie de le faire en utilisant uniquement des commandes git (y compris le truc git clean) comme démontré ici. De plus, je recommande de ne pas inclure l'exemple "exclude-from" dans votre résumé car cela ne tient pas compte des fichiers .gitignore. Je vous demande ceci en particulier parce que cette page est la première réponse de Google.

0 votes

Rapide point sur "Résumé de ce qui fonctionne" : la page de manuel "Git ls-files" explique que le "-i" signifie inclure les fichiers exclus pour la sortie ls. J'avais la même incompréhension, jusqu'à ce que je le lise ' lentement '. ;-)

929voto

VonC Points 414372

Notes :


Réponse originale 42009)

git ls-files -i

devrait fonctionner, sauf que son code source indique :

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given ?

Il s'avère qu'il faut un paramètre de plus après le -i pour énumérer quoi que ce soit :

Essayez :

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(mais cela ne ferait que répertorier votre en cachette (non ignoré), avec un filtre, donc ce n'est pas tout à fait ce que vous voulez)


Exemple :

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

En fait, dans mon fichier 'gitignore' (appelé 'exclude'), je trouve une ligne de commande qui pourrait vous aider :

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

So....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

devrait faire l'affaire.

Comme mentionné dans le Page d'accueil ls-files , --others est la partie importante, afin de vous montrer les fichiers non mis en cache, non compromis et normalement ignorés.

--exclude_standard n'est pas seulement un raccourci, mais un moyen d'inclure les éléments suivants tous les paramètres standard des "modèles ignorés".

exclude-standard
Ajoutez les exclusions standard de git : .git/info/exclude , .gitignore dans chaque répertoire, et le user's global exclusion file .

0 votes

@VocC, d'après ma compréhension de ces tests, la réponse que vous recommandez en premier peut simplement comporter de grandes failles. C'est pourquoi je recommanderais normalement la réponse de riyad à la place.

3 votes

Depuis la version Git v2.13.2 Release: git status --ignored semble également afficher les fichiers non suivis: github.com/git/git/blob/master/Documentation/RelNotes/…

1 votes

Wow, git check-ignore -v * fonctionne très bien, car il montre où la configuration a été appliquée. Merci.

678voto

xiaobai Points 2004

Il existe une manière beaucoup plus simple de le faire (git 1.7.6+):

git status --ignored

Voir Y a-t-il un moyen de dire à git-status d'ignorer les effets des fichiers .gitignore?

3 votes

Ma version est 1.7.6. Une autre version 1.7.5.1 est celle qui nécessite -s. Vous pouvez essayer git status -h pour voir si --ignored est pris en charge.

4 votes

J'ai essayé toutes les solutions sur cette page. C'est la meilleure. Elle montre à la fois les fichiers et les répertoires. Cette fonctionnalité n'était probablement pas disponible lorsque cette question a été posée à l'origine. (Au fait, aucune des solutions ne fonctionnera correctement avec un tout nouveau "git init" tant que vous n'aurez pas au moins mis en scène des modifications.)

17 votes

Ceci est certainement bien mieux que la réponse acceptée. C'est aussi beaucoup plus sûr que la solution git clean -ndX, car la situation rare où l'on oublie par erreur les drapeaux aura un effet irrévocable sur le dépôt, puisque les fichiers non suivis sont supprimés. C'est donc dangereux. Au contraire, git status --ignored est toujours sûr, même en cas de faute de frappe et c'est naturel à retenir.

415voto

MattDiPasquale Points 23842

Une autre option assez propre (sans jeu de mots) :

git clean -ndX

Explication :

$ git help clean

git-clean - Supprime les fichiers non suivis de l'arborescence de travail
-n, --dry-run - Ne supprime rien en réalité, montre simplement ce qui sera fait.
-d - Supprime les répertoires non suivis en plus des fichiers non suivis.
-X - Supprime uniquement les fichiers ignorés par Git.

Note : Cette solution ne montrera pas les fichiers ignorés qui ont déjà été supprimés.

0 votes

Nifty... cependant la raison pour laquelle j'ai posé la question initiale était pour m'assurer que les fichiers du vendeur (*.dll) qui étaient censés être là... donc les supprimer ne serait pas le résultat souhaité. CEPENDANT : c'est bon à savoir car j'ai modifié ma stratégie de l'ignorance de *.dll à l'ignorance de mon dossier de sortie de compilation (mais pas mes dossiers de vendeurs). Ce serait une bonne alternative à make clean et très utile sur un serveur de compilation.

2 votes

Je suis en train d'utiliser la version git 1.7.0.4, et les deux commandes ('git ls-files -o -i --exclude-standard', 'git clean -dXn') ne sont pas équivalentes. La première me montre 4 fichiers, et la seconde seulement deux. (.gitignore~, index.php~, sql/create_users.sql~, www/index.php~) (Supprimerait .gitignore~, Supprimerait index.php~). Est-ce que j'ai manqué quelque chose ici?

0 votes

@VonC, super! Merci! @Cesar, je ne suis pas sûr. Je ne suis pas si familier avec git ls-files -o -i --exclude-standard. git clean -dXn a toujours été ce que je voulais mais ne montre pas les fichiers ignorés qui ont déjà été supprimés. git ls-files -o -i --exclude-standard pourrait le faire. Donc, cela pourrait être ce qui cause la différence.

43voto

riyad Points 189

Alors que votre solution est généralement correcte, elle ne fonctionne pas dans toutes les circonstances. Supposons un répertoire de dépôt comme celui-ci:

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

et un .gitignore comme ceci:

# cat .gitignore
doc
tmp/*

Cela ignore le répertoire doc et tous les fichiers en dessous de tmp. Git fonctionne comme prévu, mais la commande donnée pour lister les fichiers ignorés ne le fait pas. Jetons un coup d'œil à ce que git a à dire:

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

Remarquez que doc est absent de la liste. Vous pouvez l'obtenir avec:

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

Remarquez l'option supplémentaire --directory.

D'après mes connaissances, il n'existe pas une commande pour lister tous les fichiers ignorés à la fois. Mais je ne sais pas pourquoi tmp/dir0 n'apparaît pas du tout.

2 votes

Cela m'a donné ce que je voulais, alors que les autres ne l'ont pas fait (pour mon cas particulier)... merci! C'est frustrant de devoir exécuter deux commandes, mais avec un répertoire ignoré, l'option --directory me trouve au moins ça, que je peux ensuite envoyer dans une commande find pour trouver les fichiers. Merci!

0 votes

Cela le fait tout en une fois, et étend les répertoires: (git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{p‌​rint}'

15voto

iconoclast Points 3743

Il devrait suffire d'utiliser

git ls-files --others -i --exclude-standard

car cela couvre tout ce qui est couvert par

git ls-files --others -i --exclude-from=.git/info/exclude

donc ce dernier est redondant.


Vous pouvez simplifier les choses en ajoutant un alias à votre fichier ~/.gitconfig:

git config --global alias.ignored "ls-files --others -i --exclude-standard"

Maintenant, vous pouvez simplement taper git ignored pour voir la liste. Beaucoup plus facile à retenir et plus rapide à taper.

Si vous préférez l'affichage plus succinct de la solution de Jason Geng, vous pouvez ajouter un alias pour cela comme ceci:

git config --global alias.ignored "status --ignored -s"

Cependant, la sortie plus verbeuse est plus utile pour résoudre les problèmes avec vos fichiers .gitignore, car elle répertorie chaque fichu fichier qui est ignoré. Vous passeriez normalement les résultats à travers grep pour voir si un fichier que vous attendez d'être ignoré est là, ou si un fichier que vous ne voulez pas ignorer est là.

git ignored | grep some-file-that-isnt-being-ignored-properly

Ensuite, lorsque vous voulez simplement voir un affichage court, il est assez facile à retenir et à taper

git status --ignored

(Le -s peut normalement être laissé de côté.)

0 votes

Cela n'a jamais fonctionné pour moi, car il faut lister manuellement ces fichiers. git status --ignored fonctionne sur Debian sid mais peut être très récent… mais apparemment il a été ajouté en raison d'une demande populaire ;-)

1 votes

En "fonctionne sous Debian sid", je suppose que vous voulez dire "fonctionne avec la version de Git installée par défaut sur Debian sid"? Vous devriez vraiment éviter de vous laisser prendre en otage par les versions des utilitaires inclus dans votre distribution. Vous pouvez les mettre à jour indépendamment de la distribution elle-même.

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