• [^] # Re: Mon utilisation de git ...

    Posté par . En réponse au message SubVersion vs Mercurial vs Git .... Évalué à 3.

    Comment tu fais avec Mercurial ?

    Avec Mercurial, il y a aussi l'action rebase, même si je ne l'utilise pas.

    J'ai plutôt tendance à utiliser des MQs, voire aussi à les versionner elle-mêmes.

    Qu'est-ce que les MQs ? C'est une série de patchs que tu peux empiler (qpush) et dépiler (qpop), les réordonner, le tout à volonté. Il y a d'autre possibilités, mais ceci est la base.

    Quand je travaille sur une fonctionnalité ou une correction de bug, je commence toujours une MQ. Par exemple, je décide d'ajouter une nouvelle fonction, et de l'utiliser un peu partout pour mutualiser le code :

    1. créer une MQ (automatiquement) et un premier patch
      • hg qnew add-new-function
    2. ajouter de la nouvelle fonction
    3. créer un second patch
      • hg qrefresh && hg qnew use-new-function
    4. modifier le code pour appeler la nouvelle fonction
    5. s'apercevoir que l'API a un manque
    6. dépiler au premier patch
      • hg qrefresh && hg qpop
    7. changer la fonction
    8. empiler au patch suivant
      • hg qrefresh && hg qpush
    9. modifier le code
    10. s'apercevoir d'un bug dans la fonction
    11. dépiler au premier patch
      • hg qrefresh && hg qpop
    12. corriger la fonction
    13. empiler au patch suivant
      • hg qrefresh && hg qpush
    14. tester, ça marche
      • hg qfinish

    Et voilà. Et on peut aussi versionner les MQs, qui du coup se trouvent être un repository Mercurial à part entière, donc on peut le clonner, le pusher et le puller. Si je fais une MQ sur une machine A, et que je veux l'utiliser sur une machiune B , je peux, au choix :

    1. la cloner depuis la machine B via ssh vers la machine A
    2. la pusher depuis la machine A vers un repository en ligne, et ensuite la cloner sur la machine B
    3. clonner la MQ sur une clé USB sur la machine A, transférer la clé vers la machine B, et cloner la MQ depuis la clé USB sur la machine B

    J'utilise le plus souvent 1. et 2. Par exemple, pour le projet que je maintein et développe :

    Pour utiliser ces deux MQs :

    $ hg clone http://crosstool-ng.org/hg/crosstool-ng/
    $ cd crosstool-ng
    $ hg clone http://crosstool-ng.org/hg/crosstool-ng/ct-ng.canadian/ .hg/patches-canadian
    $ hg qq --create canadian
    $ hg clone http://crosstool-ng.org/hg/crosstool-ng/ct-ng.complibs .hg/patches-complibs
    $ hg qq --create complibs
    $ hg qq
    canadian
    complibs (active)
    patches
    

    (La MQ default est toujours créée.)

    Et après, je peux les pusher en retour vers le serveur:

    $ hg qq canadian
    $ hg qq
    canadian (active)
    complibs
    patches
    $ hg --mq push ssh://user@crostool-ng.org/hg/crosstool-ng/ct-ng.canadian/
    

    Maintenant, si le repository a changé, je dépile ma MQ, je pull les nouveaux changements, et je réapplique la MQ en résolvant les conflits :

    $ hg qpop --all
    $ hg pull --update
    $ hg qpush --all
    # Arrêt sur un conflit, résolution habituelle
    $ hg qrefresh
    $ hg qpush --all
    

    Ça fait aussi un espèce de rebase, si on veut. Alors oui, il y a certains petits manques par rapport à git. Par exemple, si un patch est déjà appliqué, qpush ne s'en aperçoit pas. C'est pas très grave, un qdelete fait l'affaire.

    Franchement, ce sont pour moi devenues des opérations triviales^Wbanales.

    J'utilise Mercurial pour gérer mon ${HOME}, pour gérer mes scripts de déploiement de machines virtuelles, etc...

    D'accord, peut-être que ça ne passe pas à l'échelle comme pour le noyau Linux, quoique de très gros projets sont gérés avec brio sous Mercurial.

    Hop,
    Moi.