2009-10-02 14 views
42

J'ai besoin d'un fichier .hgdontignore :-) pour inclure certains fichiers et exclure tout le reste dans un répertoire. Fondamentalement, je veux inclure uniquement les fichiers .jar dans un répertoire particulier et rien d'autre. Comment puis-je faire ceci? Je ne suis pas très compétent en syntaxe d'expression régulière. Ou puis-je le faire avec la syntaxe glob? (Je préfère que pour la lisibilité)hgignore: aide ignorer tous les fichiers mais certains

Juste comme un emplacement d'exemple, disons que je veux exclure tous les fichiers sous foo/bar/ à l'exception de foo/bar/*.jar.

Répondre

36

Pour ce faire, vous aurez besoin d'utiliser cette expression régulière:

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

Explication

Vous dites que ce que l'ignorer, si cette expression est à la recherche des choses que vous don 't veulent.

  1. Vous recherchez un fichier dont le nom (y compris le répertoire relatif) comprend (foo/bar /)
  2. Vous regardez alors pour tous les caractères qui précèdent une période (. +? \. == apparier un ou plusieurs caractères de n'importe quel temps jusqu'à ce que vous atteigniez le caractère de période)
  3. Vous vous assurez alors qu'il n'a pas la fin "jar" (?! jar) (Ceci est appelé un regard négatif à venir
  4. Enfin, vous prenez la fin it a (. +)

les ions sont faciles à gâcher, donc je suggère fortement que vous obteniez un outil comme Regex Buddy pour vous aider à les construire. Il va décomposer une regex en anglais, ce qui aide vraiment.

EDIT

Hey Jason S, tu me pris, il ne manque ces fichiers.

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

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

Il trouve:

  • foo/bar/baz.txt
  • foo/bar/baz
  • foo/bar/pot
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar.
  • foo/bar/baz.
  • foo/bar/baz.txt.

Mais ne trouve pas

  • foo/bar/baz.jar

Nouvelle Explication

Cela dit rechercher les fichiers dans « foo/bar/», puis ne correspondent pas s'il y a zéro ou plusieurs caractères suivis par « .jar », puis a plus de caractères ($ signifie la fin de la ligne), puis, si ce n'est pas le cas, faites correspondre les caractères suivants.

+0

whee! merci, maintenant je vais essayer. –

+1

hmm, bonne idée, mais cela ne fonctionnera pas comme indiqué, car il ne correspondra pas du tout aux fichiers sans aucune extension. Mais je pense que je peux le transformer en ce dont j'ai besoin. La partie 'foo/bar /' est facile alors oublions ça pour le moment. Si vous pouvez le réparer, il doit correspondre aux fichiers "baz.txt", "baz", "jar", "baz.jar.txt", "baz.jar", "baz" et "baz.txt". " mais pas "baz.jar" alors je vais accepter. :-) –

+0

Salut Jason, je vois ce que tu veux dire. Je viens de mettre à jour ma réponse avec une regex fonctionnelle. Je l'ai testé contre chaque chaîne que vous avez listée. –

41

La réponse de Michael est une belle, mais une autre option est de simplement exclure:

foo/bar/** 

puis ajouter manuellement les fichiers .jar. Vous pouvez toujours ajouter des fichiers exclus par une règle d'ignorer et remplacer l'ignorer. Vous devez juste vous rappeler d'ajouter tous les pots que vous créez dans le futur.

+0

Comment les ajoutez-vous manuellement? Les ajouter avec "hg add" échoue, car le fichier ignoré sera utilisé. Les ajouter avec "hg add -I" échoue, car le fichier ignore s'applique toujours. Alors, comment peuvent-ils être ajoutés en remplaçant le fichier ignorer? – Mecki

+3

Mecki, en les ajoutant avec 'hg add' fonctionne bien - il remplace l'ignorant - à condition de ne pas utiliser de caractères génériques dans votre ligne d'ajout. Alors mettez foo/bar/** dans votre .hgignore, puis faites 'hg add foo/bar/path/specific.file' et vous êtes prêt à partir. Si vous avez une tonne d'exceptions à ajouter, vous pouvez rediriger le statut hg -u -n foo/bar/lots - * .jar 'vers' xargs hg add 'et effectuer vos remplacements explicites en masse. –

+1

et si quelqu'un va modifier foo/bar/path/specific.file, il sera toujours ignoré? ce n'est pas une solution mate – holms

Questions connexes