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


Je me mouille les pieds et j'ai le problème suivant:

Mon arbre source du projet:

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

J'ai le code (actuellement MEF) dans ma branche de fournisseur que je compilerai là et déplacerai alors les références dans /src/refs c'est là que le projet les reprend.

Mon problème est que j'ai mon .gitignore régler pour ignorer *.dll et *.pdb. Je peux faire un git add -f bar.dll pour forcer l'ajout du fichier ignoré qui est ok, le problème est que je n'arrive pas à déterminer quels fichiers existent sont ignorés.

Je veux lister les fichiers ignorés pour m'assurer que je n'oublie pas de les ajouter.

J'ai lu la page de man sur git ls-files et ne peut 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?

METTRE À JOUR:

git ls-files -i ne fonctionnera pas, vous obtenez l'erreur:

ls-files: --ignored needs some exclude pattern

git ls-files --others -i --exclude-from=.git/info/exclude comme VonC suggéré ci-dessous est en effet la réponse. le --exclude-standard option fonctionne également au lieu de --exclude-from.

Résumé de ce qui fonctionne:

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

459
2018-01-21 20:09


origine


Réponses:


Remarques:


Aussi intéressant (mentionné dans qwertymkde répondre), vous pouvez également utiliser le git check-ignore -v commande, au moins sur Unix (ne fonctionne pas dans un CMD les fenêtres session)

git check-ignore *
git check-ignore -v *

Le second affiche la règle actuelle du .gitignore ce qui rend un fichier à ignorer dans votre repo git.
Sur Unix, en utilisant "Qu'est-ce qui se développe récursivement dans tous les fichiers du répertoire courant?"et un bash4 +:

git check-ignore **/*

(ou un find -exec commander)


Réponse initiale 42009)

git ls-files -i

devrait fonctionner, sauf 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 autre paramètre après le -i pour lister réellement quoi que ce soit:

Essayer:

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

(mais cela ne ferait que lister votre mis en cache objet (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]
# *~

Alors....

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 le tour.

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

--exclude_standard n'est pas juste un raccourci, mais un moyen d'inclure tout paramètres standard "modèles ignorés".

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


455
2018-01-21 21:17



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

git clean -ndX

Explication:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by git.

Remarque: cette solution n'affichera pas les fichiers ignorés qui ont déjà été "nettoyés".

MODIFIER:

Il est possible que cette méthode ne capture pas tous les fichiers ignorés par git status. Voir ici pour des exemples.


358
2017-08-22 20:29



Il y a une façon beaucoup plus simple de le faire (git 1.7.6+):

git status --ignored 

Voir Est-il possible de dire à git-status d'ignorer les effets des fichiers .gitignore?


328
2017-09-18 20:14



Bien que généralement corriger votre solution ne fonctionne pas dans toutes les circonstances. Supposons un repo dir comme ceci:

# 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 la doc répertoire et tous les fichiers ci-dessous tmp. Git fonctionne comme prévu, mais la commande donnée pour répertorier les fichiers ignorés ne fonctionne pas. Jetons un coup d'oeil à ce que git a à dire:

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

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

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

Notez le supplément --directory option.

De ma connaissance, il n'y a pas de un commande pour lister tous les fichiers ignorés à la fois. Mais je ne sais pas pourquoi tmp/dir0 n'apparaît pas du tout.


34
2017-10-27 01:52



Git a maintenant cette fonctionnalité intégrée

git check-ignore *

Bien sûr, vous pouvez changer le glob à quelque chose comme **/*.dll dans ton cas

Git Référence


12
2017-08-31 18:15



Cela devrait suffire à utiliser

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

comme cela couvre tout ce qui est couvert par

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

par conséquent, ce dernier est redondant.


Vous pouvez faciliter cela en ajoutant un alias à votre ~/.gitconfig fichier:

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 comme celui-ci:

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

Cependant, la sortie plus détaillée est plus utile pour résoudre les problèmes liés à vos fichiers .gitignore, car elle répertorie tous les fichiers cotton-pickin 'ignorés. Normalement, vous feriez passer les résultats grep pour voir si un fichier que vous attendez à ê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 petit écran, il est assez facile de vous souvenir et de taper

git status --ignored

(Le -s peut normalement être laissé.)


9
2017-08-28 15:24



Voici comment imprimer la liste complète des fichiers de l’arbre de travail qui correspondent aux motifs situés dans les différentes sources de gitignore de Git (si vous utilisez GNU find):

$ cd {your project directory} \
; find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

Il vérifie tous les fichiers de la branche actuelle du référentiel (sauf si vous les avez supprimés localement).

Et il identifie également les lignes de source gitignore particulières.

Git continue à suivre les changements dans certains fichiers qui correspondent aux modèles gitignore, simplement parce que ces fichiers ont déjà été ajoutés. Utilement, la commande ci-dessus affiche également ces fichiers.

Si vous utilisez Windows, Git Bash inclut GNU find (comme révélé par find --version).

Si la liste est longue (et vous avez rev), vous pouvez aussi les afficher par extension (un peu):

$ cd {your project directory} \
; find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

Pour plus de détails, voir man find, man git-check-ignore, man rev, et man sort.


5
2017-08-12 11:24