43 votes

hgignore : aide à ignorer tous les fichiers mais certains d'entre eux

J'ai besoin d'un fichier .hgdontignore :-) pour inclure certains fichiers et exclure tout le reste dans un répertoire. En gros, je veux inclure uniquement les fichiers .jar dans un répertoire particulier et rien d'autre. Comment puis-je faire cela ? Je ne suis pas très doué pour la syntaxe des expressions régulières. Ou puis-je le faire avec la syntaxe globale ? (Je préfère cette dernière pour des raisons de lisibilité)

A titre d'exemple d'emplacement, disons que je veux exclure tous les fichiers sous foo/bar/ sauf pour foo/bar/*.jar .

42voto

Ry4an Points 56453

La réponse de Michael est bonne, mais une autre option est d'exclure tout simplement :

foo/bar/**

puis ajoutez manuellement les fichiers .jar. Vous pouvez toujours ajouter les fichiers qui sont exclus par une règle d'exclusion et ils remplacent l'exclusion. Vous devez simplement vous rappeler d'ajouter tous les fichiers jar que vous créerez à l'avenir.

0 votes

Comment faites-vous pour les ajouter manuellement ? Les ajouter avec "hg add" échoue, car le fichier ignoré sera utilisé. Les ajouter avec "hg add -I" échoue, car le fichier d'ignorances s'applique toujours. Alors comment peut-on les ajouter en passant outre le fichier d'ignorances ?

4 votes

Mecki, les ajouter avec 'hg add' fonctionne bien -- il remplace l'ignore -- à condition que vous n'utilisiez pas de jokers dans votre ligne add. Donc mettez foo/bar/** dans votre .hgignore et ensuite faites 'hg add foo/bar/path/specific.file' et vous êtes bon. Si vous avez une tonne d'exceptions à ajouter, vous pouvez passer 'hg status -u -n foo/bar/lots-*.jar' à 'xargs hg add' et faire vos modifications explicites en masse.

1 votes

Et si quelqu'un modifie foo/bar/path/specific.file, il sera quand même ignoré ? ce n'est pas une solution mon pote

38voto

Michael La Voie Points 12445

Pour ce faire, vous devez utiliser cette expression régulière :

foo/bar/.+?\.(?!jar).+

Explication

Tu lui dis ce qu'il faut ignorer, donc cette expression cherche des choses que tu Ne le fais pas. veulent.

  1. Vous recherchez tout fichier dont le nom (y compris le répertoire relatif) comprend (foo/bar/)
  2. Vous recherchez ensuite tous les caractères qui précèdent un point ( .+ ? \. == correspond à un ou plusieurs caractères de n'importe quel temps jusqu'à ce que vous atteigniez le caractère point)
  3. Vous vérifiez ensuite qu'il n'a pas la terminaison "jar" (?!jar) (C'est ce que l'on appelle un regard négatif en avant.
  4. Enfin, vous saisissez la fin qu'il a (.+)

Les expressions régulières sont faciles à gâcher, c'est pourquoi je vous conseille vivement de vous procurer un outil tel que Regex Buddy pour vous aider à les construire. Il décompose une regex en anglais simple, ce qui est très utile.

EDIT

Hey Jason S tu m'as eu, il manque ces fichiers.

Cette regex corrigée fonctionnera pour tous les exemples que vous avez cités :

foo/bar/(?!.*\.jar$).+

Il constate :

  • foo/bar/baz.txt
  • foo/bar/baz
  • foo/bar/jar
  • foo/bar/baz.jar.txt
  • foo/bar/baz.jar.
  • foo/bar/baz.
  • foo/bar/baz.txt.

Mais ne trouve pas

  • foo/bar/baz.jar

Nouvelle explication

Cela signifie qu'il faut chercher les fichiers dans "foo/bar/", puis ne pas chercher s'il y a zéro ou plus de caractères suivis de ".jar" et ensuite plus de caractères ($ signifie fin de ligne), puis, si ce n'est pas le cas, chercher tous les caractères suivants.

1 votes

Hmm, bonne idée, mais ça ne fonctionnera pas comme indiqué, puisque ça ne correspondra pas aux fichiers sans aucune extension. Mais je pense que je peux le transformer en ce dont j'ai besoin. Le site foo/bar/ est facile, alors oublions cela pour le moment. Si vous pouvez le corriger pour qu'il corresponde aux fichiers "baz.txt", "baz", "jar", "baz.jar.txt", "baz.jar.", "baz.", et "baz.txt." mais PAS à "baz.jar" alors j'accepterai. :-)

0 votes

Hé Jason, je vois ce que tu veux dire. Je viens de mettre à jour ma réponse avec une regex qui fonctionne. Je l'ai testée avec toutes les chaînes que tu as listées.

2 votes

Cette solution fonctionne très bien pour moi, mais je voulais juste ajouter que le fichier .hgignore devrait avoir syntax: regexp avant de l'utiliser. Vous pouvez revenir à syntax: glob plus tard dans le fichier.

1voto

Raphaël Gomès Points 570

Toute personne souhaitant utiliser des têtes de lecture négatives (ou ?! dans la syntaxe de l'expression rationnelle) ou tout autre type de mécanisme de rétro-référencement doit savoir que Mercurial se repliera sur la syntaxe de google. RE2 de Python re pour la correspondance.

RE2 est un moteur non rétroactif qui garantit un temps d'exécution linéaire avec la taille de l'entrée. Si les performances sont importantes pour vous, c'est-à-dire si vous avez un gros référentiel, vous devriez envisager de vous en tenir à des modèles plus simples que Re2 prend en charge, c'est pourquoi je pense que l'option solution proposée par Ryan .

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