web-dev-qa-db-fra.com

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

Je commence à me mouiller les pieds sur git et j'ai le problème suivant:

Mon arbre source du projet:

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

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

Mon problème est que mon .gitignore est configuré pour ignorer *.dll et *.pdb. Je peux faire un git add -f bar.dll pour forcer l'ajout du fichier ignoré, ce qui est ok, le problème est que je ne peux pas trouver la liste des fichiers qui sont ignorés.

Je veux lister les fichiers ignorés pour être sûr de ne pas oublier de les ajouter.

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

569
Andrew Burns

Remarques:


Également intéressant (mentionné dans qwertymkréponse ), vous pouvez également utiliser le git check-ignore -v la commande, du moins sous Unix ( ne fonctionne pas dans un CMD Windows session)

_git check-ignore *
git check-ignore -v *
_

La seconde affiche la règle actuelle du _.gitignore_ qui crée un fichier à ignorer dans votre référentiel git.
Sous Unix, utilisez " Ce qui se étend vers tous les fichiers du répertoire actuel de manière récursive? " et un bash4 +:

_git check-ignore **/*
_

(ou une commande _find -exec_)


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 encore un paramètre après le _-i_ pour répertorier quoi que ce soit:

Essayer:

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

(mais cela ne ferait que lister votre objet en cache (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 l'affaire.

Comme indiqué dans la page de manuel ls-files , _--others_ est l’essentiel, afin de vous montrer les fichiers non mis en cache, non validés et normalement ignorés.

_--exclude_standard_ n'est pas simplement un raccourci, mais un moyen d'inclure all == "paramètres ignorés" standard.

_exclude-standard_
Ajoutez les exclusions git standard: _.git/info/exclude_, _.gitignore_ dans chaque répertoire et le _user's global exclusion file_.

571
VonC

Il existe un moyen 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?

410
Penghe Geng

Une autre option qui est 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 ne montrera pas les fichiers ignorés qui ont déjà été supprimés.

391
ma11hew28

Bien que généralement correct, 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 ça:

# cat .gitignore
doc
tmp/*

Cela ignore le répertoire doc et tous les fichiers situés sous tmp. Git fonctionne comme prévu, mais la commande donnée pour lister les fichiers ignorés ne fonctionne pas. Regardons ce que git a à dire:

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

Notez 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.

À ma connaissance, il n’existe pas de commande n pour répertorier tous les fichiers ignorés simultanément. Mais je ne sais pas pourquoi tmp/dir0 ne se présente pas du tout.

39
riyad

Git a maintenant cette fonctionnalité intégrée

git check-ignore *

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

Référence Git

17
qwertymk

Voici comment imprimer la liste complète des fichiers de l’arborescence de travail correspondant aux modèles situés n’importe où dans les multiples 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érifiera 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 sources de gitignore.

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

Les modèles de gitignore négatifs sont également appariés. Cependant, ceux-ci se distinguent facilement dans la liste, car ils commencent par !.

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

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

$ 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.

L'intérêt de cette approche est que Git (le logiciel) évolue rapidement et est extrêmement complexe. En revanche, la find de GNU est extrêmement stable (du moins, dans ses fonctionnalités utilisées ici). Ainsi, toute personne souhaitant être compétitive en affichant sa connaissance approfondie de Git répondra à la question différemment.

Quelle est la meilleure réponse? Cette réponse minimise délibérément le recours à la connaissance de Git pour atteindre l'objectif de stabilité et de simplicité grâce à la modularité (isolation des informations), et est conçue pour durer long temps.

9
MarkDBlackwell

(étendant les autres réponses)

Remarque: git check-ignore utilise le .gitignore validé et non celui de votre arbre de travail! Pour jouer avec cela sans polluer votre historique git, vous pouvez librement essayer de le modifier, puis valider avec un git commit --amend.

Ce problème survient principalement si vous avez besoin d'une solution de contournement, git ne suit pas les répertoires. Entrez dans le .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keep devrait être un fichier de longueur nulle dans dirtokeep.

Le résultat sera que tout dans dirtokeep sera ignoré, saufdirtokeep/.keep, ce qui entraînera également le répertoire dirtokeep être construit sur clone/checkout.

1
peterh

En supposant qu'il y ait quelques répertoires ignorés, pourquoi ne pas utiliser "git status node/logs /" qui vous indiquera quels fichiers doivent être ajoutés? Dans le répertoire, j'ai un fichier texte qui ne fait pas partie de la sortie de statut, par exemple:

Sur le chef de branche
Votre branche est à jour avec 'Origine/maître'.
Fichiers non suivis:
(utilisez "git add ..." pour inclure dans ce qui sera commis)

    node/logs/.gitignore 

.gitignore est:

*

!. gitignore

0
pikknz