9
votes

.hgignore ne pas être analysé pour un certain utilisateur

J'ai un projet sous contrôle de version, disons, dans / projet code> et .hgignore code> situé au /project/.hgignore code>. Sa syntaxe semble correcte, mais le problème est que ce fichier est complètement ignoré pour certains utilisateurs tout en analysés pour les autres.

dire, exécuté p> xxx pré>

montre les résultats corrects Les fichiers ignorés, tandis que p> xxx pré>

génèrent également des fichiers énumérés dans /project/.hgignore code>. p>

Qu'est-ce que j'ai déjà vérifié:

  • ~ / .hgrc code> est identique pour les deux utilisateurs, de sorte que les sorties sont des sorties pour hg showconfig code>. li>.
  • Les deux utilisateurs peuvent lire /project/.hgignore code> et écrire à cela. Li> ul>

    Qu'est-ce que je manque? P>

    (Juste au cas où: Debian Lenny, Mercurial 1.6.3) P>

    // Désolé si les noms d'utilisateur semblent stupides, ils ne sont pas stupides réel (: p>

    - ajouté 2010-11-26 - P>

    PS. Y a-t-il un moyen de lancer HG et d'obtenir la sortie de débogage sur le traitement .hgignore Code> -S? HG -DEBUG Statut CODE> et STATUS HG --DEBUG CODE> N'imprimez rien sensible. P>

    - Ajouté 2010-11026 - - P>

    Débogage HG Statut code> (résultats varient): P>

    # su -l dipsy -c 'cd /project; strace hg status --ignore 2>&1 >/dev/null | grep hgignore'
    open("/project/.hgignore", O_RDONLY|O_LARGEFILE) = 3
    fstatat64(3, ".hgignore", {st_mode=S_IFREG|0664, st_size=214, ...}, AT_SYMLINK_NOFOLLOW) = 0
    
    # su -l laalaa -c 'cd /project; strace hg status --ignore 2>&1 >/dev/null | grep hgignore'
    open("/project/.hgignore", O_RDONLY|O_LARGEFILE) = 3
    fstatat64(3, ".hgignore", {st_mode=S_IFREG|0664, st_size=214, ...}, AT_SYMLINK_NOFOLLOW) = 0
    


0 commentaires

5 Réponses :


1
votes

sont les deux utilisateurs exécutant la même version de hg ? Est-ce qu'ils ont tous deux la permission de lire le fichier .hgignore?


1 commentaires

Absolument, une seule version de Mercurial est installée. Juste re-coché. J'ai même essayé de faire le deuxième utilisateur le propriétaire de .hgignore - toujours pas de succès.



1
votes

hrm. Juste pour être sûr, quelle commande vous dit qu'ils sont analysées pour certains utilisateurs et ignorés des autres? Confirmez-vous que avec Statut HG --Intionnalisé ? Les gens de Somtimes oublient que «HG Add» remplace le statut de fichier ignoré, donc si un utilisateur a déjà ajouté (et peut-être engagé) ces fichiers mais non poussés qui ajoutez à la repo l'autre visualisent alors que la personne peut facilement penser que leur HGignore n'est pas. Être consulté quand c'est vraiment ce que les fichiers ajoutés font ignorer l'absence de pertinence.

Était-ce que je m'envole à utiliser strace suivant. Quelque chose comme strace hg statut --Intionnalisé | grep hgignore et comparez la sortie pour deux utilisateurs.


1 commentaires

Je vérifiais si .hgignore est lu en ajoutant une ligne qui provoquerait une erreur de syntaxe. Quoi qu'il en soit, j'ai ajouté une sortie strace , voir ci-dessus (BTW, Strace écrit sur starr , donc simplement | grep < / code> ne fonctionnera pas). Etrange Thing est, .hgignore est lu sur Statut HG --Imore et non sur Statut HG , pour un utilisateur.



1
votes

Mercurial est écrit à l'aide de Python, découvrant désormais ce qui se passe ne devrait pas être trop difficile. Vous venez de mettre des traces dans mercurial / ignor.py (utilisez simplement la fonction de warn (), il est à but d'imprimer des avertissements à la console des commandes mercuriales). Si vous mettez avertir ("je suis ici") juste avant de pat = {} dans la fonction def ignore (racine, fichiers, warn) Il devrait imprimer l'avertissement "Je suis ici" chaque fois qu'il prend en compte le .hgignore . Après cela, il vous appartient de demander les bonnes traces de comprendre le comportement. Si vous connaissez Python, cela ne devrait pas prendre plus de quelques minutes.


2 commentaires

On dirait que ce module Ignorer n'est parfois pas chargé. Essayant actuellement de déboguer mercurial / demande .py à la place ...


Peut-être que c'est un problème avec Sys.Path dans le contexte de l'utilisateur? Ou votre utilisateur exécute votre interprète Python dans un bac à sable ou une version différente de Python, ou quelque chose comme ça?



1
votes

grea ^ w Quelque succès.

Il y avait un autre référentiel HG se cachant dans l'un des sous-dossiers, cela semble la cause la plus probable des problèmes décrits. Je suppose que l'autre .hgignore a été lu avant celui que j'avais réellement nécessaire, et tout ce qui suit .hgignore -s ont été abandonnés.

Cependant, vous déplacez ce référentiel et laissant un lymnique sur sa place n'a pas aidé à la fois.

Alors, j'ai décidé d'agir radicalement:

  • supprimé un cookie de ~ / .hgcookies (je suppose créé par module d'authentification du four)
  • supprimé /project/.hgignore du tout
  • supprimé Symlink vers un autre référentiel (décrit ci-dessus)
  • ajouté [ui] ignore = .hgignore à ~ / .hgrc
  • changements engagés / poussés
  • recréé /project/.hgignore , ajouté / commis / poussé à nouveau
  • ajouté Symlink - il est maintenant ignoré pour l'un des utilisateurs

    Vous ne savez pas quelle étape exactement l'astuce, mais tout semble fonctionner comme prévu maintenant, /project/.hgignore est analysé pour chaque utilisateur.

    [ui] ignore = .hgignore n'est pas la solution que je l'ai supprimée plus tard et qu'elle n'a rien brisé.

    Donc, le problème est résolu mais WTF est toujours sans réponse (:

    Merci à tous. et oui, ne reposez pas sur des référentiels imbriqués.


1 commentaires

"Ne comptez pas sur des référentiels imbriqués" est la mauvaise conclusion. Assurez-vous simplement que vous indiquez à Mercurial à propos de tous les référentiels imbriqués dans le fichier Versed .hgsub , comme décrit ici .



6
votes

Réponse 1 - La corruption du référentiel d'artstate

Je viens d'avoir ce problème aussi hier soir et je me conduisais au mur en essayant de le trouver. J'ai finalement trouvé une page wiki sur corruption de référentiel dirsidée . La première étape impliquant l'exécution hg vérifie code> n'a pas fonctionné. La deuxième étape, clonant le repo, a fonctionné! J'ai ensuite supprimé le répertoire original .hg et copié le répertoire du clone .hg à l'emplacement d'origine. P>

Je suppose que dans votre réponse, les étapes impliquant des commentations / poussées peuvent avoir fixé la corruption dans votre référentiel . P>


Réponse 2 - Inotify Extension Bug H2>

Après avoir fixé à l'origine le problème et posté ma réponse, le problème a continué de figurer, mais de manière différente: Mercurial semblait Pour être partiellement obéissant au fichier .hgignore, mais toutes les mises à jour que j'ai faites à elle n'a pas pris effet. Je joue dans la création d'un script pour créer plusieurs référentiels connexes et j'ai remarqué après un moment que ma machine était à court de mémoire. J'ai couru un PS -e code> et il y avait tous ces processus hg code> suspendu dans la mémoire. Tous ces processus étaient des serveurs inotify. P>

Inotify est une extension, expédiée avec Mercurial, qui souscrit à toute modification de votre répertoire de travail afin d'améliorer les performances du statut code> HG code> sur les grands référentiels. Le inotify Extension Page mentionne que "il doit certainement être considéré comme expérimental". Il semble que certains bugs dans les serveurs Inotify empêchent la réalisation de la mercuriale Le fichier .hgignore a été mis à jour et donc Statut HG Code> a toujours utilisé une version sale de .hgignore. P>

Essayez ma théorie et obtenez temporairement HG pour rafraîchir l'actualisation .hgignore I Exécuté: P>

[extensions]
hgext.inotify = !


3 commentaires

Génial, ça a fonctionné. Maintenant, mon plan de récupération est plus court - juste HG Clone / Repo / NewRepo; mv /repo/.hg /repo/.hg.bak; cp -r /newrepo/.hg /repo/.hg . Pas besoin de tirer / pousser en effet.


Le killall -s2 hg a fait le tour pour moi. Merci! BTW, il semble que je dois le faire à chaque fois que je change le fichier .hgignore.


Si vous souhaitez arrêter les serveurs Inotify de l'exécution automatiquement, vous devez donc les tuer chaque fois que vous mettez à jour .hgignore , il suffit de mettre la ligne: hèxt.inotify =! dans le [Extensions] section de votre fichier .hgrc . Le ! dit à Mercurial de ne pas démarrer l'extension / serveur Inotify.