2010-09-03 10 views
13

Je gère $ HOME à l'aide de Mercurial, pour garder mes fichiers de pointage sympas et suivis, ou du moins ceux qui m'importent. Cependant, il y a une profusion de fichiers et de répertoires dans ~ qui n'ont pas besoin d'être suivis, et cet ensemble est en constante évolution et ne cesse de croître.Comment puis-je ignorer tous les répertoires sauf un en utilisant .hgignore?

Historiquement, je l'ai traité en ayant cette .hgignore:

syntax: glob 
* 

Cela permet de maintenir mon statut propre, dans la mesure où il va, ce qui ne précédemment suivi des fichiers visibles. Cependant, j'ai quelques répertoires (dans mon cas, scripts, .emacs.d) que je voudrais voir des dossiers non suivis dedans; J'ai presque toujours voulez suivre les nouveaux ajouts à ces répertoires.

Je sais que je peux exécuter hg st -u scripts pour identifier les fichiers non-suivis, mais je veux un moyen par lequel je peux atteindre la même fonction en utilisant le statut d'état de base.

Existe-t-il un moyen de le faire?

Répondre

17

Essayez ceci dans .hgignore à la place:

syntax: regexp 

^(?!(scripts|foo|bar)/)[^/]+/ 
  • ^ Début des matchs de chemin
  • (?!(scripts|foo|bar) utilise préanalyse négative d'ignorer tous les fichiers sauf ceux dans les répertoires scripts, foo ou bar
  • /) veille à ce que les répertoires ayant un répertoire suivi en tant que préfixe sont ignorés
  • [^/]+/ puis correspond effectivement à un répertoire (à l'exception ne sont pas exclues par le test avant), de sorte que les fichiers ~ ne sont pas ignorés

crédit à l'idée centrale dans cette solution (la préanalyse négative) va à Michael La La réponse de Voie à this question

+0

Ceci est la plupart d'une solution, mais tous les fichiers dans ~ sont toujours affichés, ce qui est à _least_ comme bruyant. Je ne surveille pas tous les fichiers (pas le moins important car beaucoup de paquets insistent pour les déposer dans mon répertoire). –

+1

À moins que vous ne puissiez utiliser les modèles de noms de fichiers pour distinguer les fichiers de points (à ignorer) des répertoires (à ne pas ignorer), je pense que vous n'avez pas de chance. Mercurial docs dit que si un chemin 'a/b/c' ne correspond pas à un modèle' .hgignore', le même modèle est essayé contre 'a/b' et, si cela échoue,' a'. Ainsi, les fichiers et répertoires de la racine ne peuvent être distingués que par leur orthographe. Si seulement quelques répertoires suivis commencent par un point, vous pouvez ajouter manuellement ceux-ci et '.hgignore' tout le reste en commençant par un. – shambulator

8

Cette question a été posée ici sur SO plusieurs fois, et vous obtiendrez beaucoup de réponses alambiquées en utilisant des assertions négatives de largeur nulle, un tour de regex souvent abusé, mais les meilleures solutions est de (a) simplement faire le repo dans ce répertoire seul ou (b) ajouter simplement les fichiers dans ce répertoire. Pour l'option (b) vous devez simplement mettre .* dans votre fichier .hgignore pour tout ignorer, puis manuellement hg add les fichiers que vous voulez suivre. Dans mercurial, contrairement à svn et cvs, vous pouvez remplacer un ignore avec un add.

+0

La création du repo dans ce répertoire ne suit pas les fichiers dans la racine, ou laisse l'option de suivi d'autres répertoires dans le même référentiel.Quel est le problème avec l'utilisation de lookahead? – shambulator

+0

Rien ne va pas, c'est juste compliqué et rarement fait. La plupart du temps, les gens ajoutent simplement les exceptions et ignorent tout s'ils le souhaitent. Hgignore était une liste blanche au lieu de la liste noire. –

+0

Assez bien - je ne nierai pas qu'il a fallu quelques tentatives pour obtenir la regex droite, et c'est en supposant que je n'ai pas manqué un cas de coin :) Chacun que vous obtenez bien vous aide avec le prochain, cependant! Et de cette façon, vous utilisez juste 'hg status' et' hg addremove'. – shambulator