2013-03-03 5 views
0

Lors du développement de mon logiciel, je crée un ensemble de cas de test qui peut être fait automatiquement via make tests. Pour garder les choses organisées je les mets dans un sous-répertoire tests. Pour garder mes commits organisés aussi bien et pour ne pas encombrer mes branches de développement, j'ai créé une branche supplémentaire tests où je commets les unités de test.basculer les branches en hg tout en conservant les fichiers

Mon problème est le suivant: quand je commets les unités à la branche de test et revenir au développement, ces essais sont supprimés

D:\Project>hg branch test 
D:\Project>edit... 
D:\Project>hg add 
D:\Project>hg commit 
D:\Project>hg up dev 
2 files updated, 0 files merged, 3 files removed, 0 files unresolved 

Comment puis-je conserver ces fichiers? (i essayé la solution pour Mercurial: Switch working directory to branch without losing changes? mais il supprime toujours les fichiers)

EDIT Voir ma réponse ci-dessous

Répondre

4

Ces fichiers de test n'existent pas dans votre branche de développement, de sorte que lorsque vous extrayez le développement branche ils ne seront pas dans le répertoire de travail. Les DVCS comme Mercurial et git ne vous permettent pas d'avoir un répertoire extrait à une révision/branche et un autre à une autre révision/branche.

Les réponses auxquelles vous avez lié sont pour amener les fichiers modifiés et leurs fichiers dans une autre branche, ils ne sont pas ce que vous demandez.

Donc, la façon dont vous voulez le faire (branches distinctes) ne va pas travailler, mais il y a beaucoup d'autres/meilleures options

Un choix serait de faire vos tests un patch qui est géré par un mq (Mercurial Queues) référentiel, qui peut lui-même être versionné. Puis, quand vous où dans votre branche dev et je voulais exécuter les tests que vous feriez:

hg qpush # tests show up 
... run tests, edit tests .. 
hg qrefresh # save the changes you made to the test 
hg qpop # tests vanish again 

MQ est poweful, mais parfois un peu difficile à enrouler autour de votre tête. Un autre choix consisterait à faire de vos tests un référentiel parent et votre code actuel un référentiel enfant de ce parent. Votre mise en page de disque ressemblerait à ceci:

parent/ 
    tests/ 
    existingrepo/ # <-- the repo you already have w/o tests 

Ensuite, les gens pourraient cloner et vous pourriez pousser le existingrepo w/o des tests, mais le repo externe comprendrait un pointeur vers elle et les deux seraient versionné au même rythme. Encore une fois, un peu difficile, mais a de bons résultats.

La troisième option, et mes préférences, est de surmonter la mentalité «Pour que mes commits restent organisés et pour ne pas encombrer mes branches de développement». Les tests sont tout aussi importants que le code primaire, ils doivent être versionnés avec le code, et ils n'encombrent rien, ils fournissent des outils précieux pour comprendre ce que fait le code. Vous pouvez toujours utiliser hg log --exclude tests/ pour voir un historique qui les exclut lorsque cela vous convient.

Pour prendre cette plongée juste faire:

hg update development 
hg merge tests 

et vous êtes bon pour aller.

2

quand je commets les unités à la branche de test et revenir au développement, ces essais sont supprimés

Il est prévu et un résultat correct: branches magasin divergé lignes de développement, vous add quelque chose seulement dans la branche de test, avant de fusionner ces données existent que dans la branche sur la création

pour « garder mon commits organisé aussi bien et de ne pas encombrer mes branches de développement ... », mais des tests dans la branche de développement, vous pouvez utiliser au moins deux façons:

  • fusion périodiquement tests branche à development (tous les changements dans les tests apparaîtront dans le développement), mais seulement pour utiliser le log changesets dans la branche de développement, peut-être sans mergesets des tests. Il est plutôt simplement revset, vous pouvez même écrire la commande log avec revset dans les alias et utiliser la commande aliased quand nécessaire. Comme Ry4an mention, vous pouvez au lieu de séparer les branches, effectuer la séparation de référentiel avec la technique subrepo | guestrepo - si les tests sont stockés dans subdir des prises en pension principale, convertir/tests dans le référentiel imbriqué -> subrepository et ont deux prises en pension indépendants, mais liés (lecture future: Subrepository dans wiki Mercurial et Subrepositories dans Mercurial kick Start Exercices)
0

à aCHIVE ce que je voulais J'ai finalement créé un sous-répertoire pour le repo:

project/ 
    main.cpp 
    makefile 
    .repo/ 
    .hg/ 

et a créé une nouvelle cible make:

REPO := .repo 

init: $(REPO) $(REPO)/.hg 

$(REPO): 
    mkdir -p $(REPO) 

$(REPO)/.hg: 
    hg init $(REPO) 

commit : | $(REPO) $(REPO)/.hg 
ifdef BRANCH 
    hg -R $(REPO) update -C $(BRANCH) 
endif 
    find . -regex "^\./[^.].*" -exec cp --parents {} ./$(REPO) \; 
# the regex prevents "hidden" dot-folder from copying 
# one could use --link to save time and drive usage/space 
# but i am concerned about hg auto merging and overriding (per hardlink) 
# my actual changes 
    hg -R $(REPO) commit $(EXTRA) 

donc je pouvais émettre make commit BRANCH=tests à engager à la branche arbitraire sans perdre toutes les modifications ne sont pas pertinents à la branche. La mise en œuvre de hg add comme wipe .repo, copy file therehg -R .repo add $(filename) est laissé comme l'exerciseur pour le lecteur

Questions connexes