Question

J'utilise CVS et après une fusion, j'ai des centaines de conflits. Aucun des conflits sont un problème (ils sont peu importants changements en raison des différences d'expansion par mot-clé sur le tronc et la branche).

Je sais qu'aucune modification n'a été apportée aux fichiers car cela est tout simplement une fusion d'une branche de fournisseur dans le coffre. Quelques dizaines de dossiers ont été inspectés au hasard pour valider cela.

Y at-il un moyen rapide de résoudre tous les conflits sans faire chacun manuellement? (Je TortoiseCVS, WinCVS et la ligne de commande à ma disposition).

Était-ce utile?

La solution 3

Je vais répondre à ma propre question que la solution proposée par EMACS @jesup était peu pratique pour quelqu'un qui n'a pas utilisé emacs 15 ans!

Dans mon cas, parce que je savais que le seul conflit était dans l'expansion des mots-clés $ LOG de $ et je ne se soucient vraiment du contenu des commentaires. J'ai vu deux solutions possibles:

  1. revenir à l'importation de la source des fournisseurs et veiller à ce que l'expansion de mot-clé est désactivé et refaire la fusion.

  2. être courageux et copier tous les fichiers de fournisseurs sur les fichiers de conflit (résolvant ainsi le conflit). Dans mon cas, je savais qu'il n'y avait pas eu de changements que nous avons effectués c'était une option sans risque.

Je suis allé avec 2. Une comparaison basée sur des règles en utilisant BeyondCompare confirmé tous les fichiers eu que des changements 'sans importance'.

Autres conseils

pouvez-vous faire à nouveau la fusion?

faire

  

Mise à jour cvs -kk

avant la fusion, ce ne sera pas élargir les mots-clés.
Le seul mot-clé qui sera un problème est le journal $ un élément

Vous pouvez programmer une macro pour le faire dans Emacs sans trop de difficultés - si vous êtes habitué à emacs / elisp, ou si vous avez probablement pu le faire sans elisp à l'aide d'une macro clavier dans emacs, puis en utilisant ^ u ^ u ^ u ^ u ^ u ^ x ^ e (répétition macro du clavier (^ x ^ e) 1024 fois, chaque ^ u augmente le nombre 4x). La macro serait une simple répétition des commandes nécessaires pour résoudre un conflit dans le fichier. Vous pouvez également charger tous les fichiers avec des conflits dans des tampons, puis utilisez elisp ou peut-être une macro du clavier pour résoudre les conflits, puis passer à l'autre tampon, et répéter.

Je ne serais pas surpris s'il y a un moyen plus facile, mais cela fonctionne. Et même si vous devez charger tous les fichiers dans des tampons, puis exécutez la macro du clavier, vous cando cela et être fait dans un temps relativement court.

Pseudo-emacs:

cvs status | grep conflict >/tmp/foo;
load /tmp/foo into an emacs buffer
edit buffer to remove all but the file/pathnames (use keyboard macros!)
load them all into buffers:
^x^(        (start-macro)
^@^e        (mark (or control-space), then end-of-line)
ESC-w       (copy)
^n^a        (next-line, beginning of line (set up for next iteration))
^x^f        (load-file)
^y          (yank saved)
<RETURN>    (load it - you could resolve conflicts right here and save)
^xb         (switch to buffer)
foo<RETURN> (go back to foo)
^x^)        (end macro)
^x^e        (repeat macro once) or
^u^u^u^u^u^x^e (repeat macro 1024 times or until BEEP)

Maintenant, vous avez tous les centaines de fichiers dans les tampons emacs, et vous pouvez configurer une macro pour saisir la mémoire tampon suivante, résoudre les conflits, et enregistrez-le -. Puis répéter fois macro N

Voici un programme C ++ je l'ai écrit pour ce faire. Il compile dans Visual Studio 2008 Express, et probablement tout autre compilateur.

Cette sortie d'entrée se fait par redirection, ce qui est peut-être pas pratique, mais vous pouvez écrire un fichier cmd pour appeler, comme

@echo off
copy /y %1 \temp\t
resolve %2 %3 < \temp\t > %1
del \temp\t

Le code est

// resolve.cpp
#include "stdafx.h"
#include "string.h"

int main(int argc, char* argv[])
{
    const int MAXWIDTH = 10000;
    char line[MAXWIDTH];

    enum { ECHO, OLD, NEW, ERROR };

    int state = ECHO;
    int num = 0;
    int quiet = 0;
    int pick = OLD;

    for (int i = 1; i < argc; ++i)
    {
        if (!strcmp(argv[i],"-h") || !strcmp(argv[i],"--help") || !strcmp(argv[i],"?"))
        {
            printf("Automatically fix CVS merge conflicts.\n"
                "Options:\n"
                " -n use the bottom code, the new code (default uses top, old code).\n"
                " -q quiet\n"
                " -h help\n"
                "use stdin and stdout for input/output and stderr for status.");
            return 0;
        }
        else if (!strcmp(argv[i],"-n"))
        {
            pick = NEW;
        }
        else if (!strcmp(argv[i],"-q"))
        {
            quiet = 1;
        }
        else
            fprintf(stderr,"unknown option %s\n",argv[i]);
    }

    while (fgets(line, MAXWIDTH, stdin))
    {
        // trim trailing whitespace
        for (int i = strlen(line); i >= 0 && line[i] < ' '; --i) 
            line[i] = 0;

        ++num;
        if (!strncmp(line,"<<<<<<< ",8))
        {
            state = (state==ECHO) ? OLD : ERROR;
            if (!quiet)
                fprintf(stderr,"At line: %d\n", num);
        }
        else if (!strcmp(line,"======="))
        {
            state = (state==OLD) ? NEW : ERROR;
        }
        else if (!strncmp(line,">>>>>>> ",8))
        {
            state = (state==NEW) ? ECHO : ERROR;
        }
        else
        {
            if (state == ECHO || state == pick)
                printf("%s\n",line);
            if (!quiet && state != ECHO)
                fprintf(stderr,"%c%s\n", (state==pick) ? '+' : '-', line);
            continue;
        }
        if (!quiet)
            fprintf(stderr,"%s\n",line);
    }
    return 0;
}

Disclaimer:. Vous pouvez vérifier votre sortie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top