Existe-t-il un moyen de voir pourquoi certains fichiers sont ignorés par git (c'est-à-dire quelle règle dans un .gitignore
fichier entraîne l'ignorance du fichier)?
Imaginez que j'ai ceci (ou un scénario beaucoup plus complexe, avec des centaines de dossiers et des dizaines de .gitignore
fichiers:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
Si je lance git add folder/subfolder/file.txt
git, je peux me plaindre qu'il soit ignoré:
The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.
Existe-t-il un moyen de savoir lequel de tous les possibles .gitignore
a une règle pour ignorer ce fichier et afficher également la règle? Comme:
The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.
Ou juste:
$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
git check-ignore
aura bientôt (git1.8.5 / 1.9) une--no-index
option. Voir ma réponse ciGIT_TRACE_EXCLUDE=1 git status
sera bientôt un moyen supplémentaire de déboguer les.gitignore
règles. Voir ma réponse modifiée ciRéponses:
Voir la page de manuel pour plus de détails.
La réponse originale suit:
git ne fournit actuellement rien de tel. Mais après avoir vu votre question, j'ai fait une recherche sur Google et j'ai découvert qu'en 2009, cette fonctionnalité avait été demandée et partiellement mise en œuvre . Après avoir lu le fil, je me suis rendu compte que ce ne serait pas trop de travail pour le faire correctement, j'ai donc commencé à travailler sur un patch et j'espère que ce sera fini le lendemain ou deux. Je mettrai à jour cette réponse lorsqu'elle sera prête.
MISE À JOUR: Wow, c'était beaucoup plus difficile que ce à quoi je m'attendais. Les entrailles de
git
la gestion des exclusions sont assez énigmatiques. Quoi qu'il en soit, voici une série de validations presque terminées qui s'appliquent à lamaster
branche en amont d'aujourd'hui . La suite de tests est terminée à 99%, mais je n'ai pas encore fini de gérer l'--stdin
option. J'espère que je gérerai cela ce week-end, puis soumettrai mes correctifs à la liste de diffusion git.En attendant, j'accueillerais certainement les tests de toute personne en mesure de le faire - il suffit de cloner à partir de ma
git
fourchette , de vérifier lacheck-ignore
branche et de la compiler comme d'habitude.MISE À JOUR 2: C'est fait! La dernière version est sur github comme ci-dessus, et j'ai soumis la série de correctifs à la liste de diffusion git pour examen par les pairs. Voyons ce qu'ils en pensent ...
MISE À JOUR 3: Après plusieurs mois de piratage / révisions de correctifs / discussions / attente, je suis ravi de pouvoir dire que cette fonctionnalité a maintenant atteint la
master
branche de git et sera disponible dans la prochaine version (1.8.2, prévue le 8 Mars 2013). Voici lacheck-ignore
page de manuel . Ouf, c'était bien plus de travail que ce à quoi je m'attendais!MISE À JOUR 4: Si vous êtes intéressé par l'histoire complète de l'évolution de cette réponse et de la mise en œuvre de la fonctionnalité, consultez l' épisode # 32 du podcast GitMinutes .
la source
git check-ignore
ne fait rien.git check-ignore
est présent et fonctionne en 1.8.2. Si le comportement n'est pas celui que vous attendez, je vous suggère de (relire) la page de manuel, et si ce n'est toujours pas le cas, veuillez soumettre un rapport de bogue approprié sur la liste de diffusion git. Dire simplement qu'il ne fait rien n'est pas très utile. Je suppose que vous l'avez probablement exécuté sur un fichier non ignoré et que vous attendez à tort une sortie (bien que j'ajouterai probablement la prise en charge--show-unmatched
du--verbose
mode de sortie à l'avenir).Mise à jour git 2.8 (mars 2016):
Voir " Un moyen de valider le
.gitignore
fichier "C'est complémentaire à ce qui est
git check-ignore -v
décrit ci-dessous.Réponse originale: septembre 2013 (git 1.8.2, puis 1.8.5+):
git check-ignore
s'améliore à nouveau dans git 1.8.5 / 1.9 (T4 2013) :Voir commit 8231fa6 sur https://github.com/flashydave :
la source
Je ne trouve rien dans la page de manuel mais voici un script rapide et sale qui vérifiera votre fichier dans chaque répertoire parent pour voir s'il peut être ajouté par git. Exécutez-le dans le répertoire contenant le fichier de problème en tant que:
où
STOP_DIR
est le répertoire de niveau supérieur du projet Git etFILENAME
est le nom du fichier problématique (sans chemin d'accès). Il crée un fichier vide du même nom à chaque niveau de la hiérarchie (s'il n'existe pas) et essaiegit add -n
de voir s'il peut être ajouté (il se nettoie après lui-même). Il produit quelque chose comme:Le scénario:
la source
Pour ajouter à la réponse principale de l'utilisation
git check-ignore -v filename
(merci BTW), j'ai trouvé que mon fichier .gitignore bloquait tout parce qu'il y avait une nouvelle ligne après un caractère générique, donc j'avais:* .sublime-project
par exemple. Je viens de supprimer la nouvelle ligne, et le tour est joué! C'était réparé.
la source