Domanda

Sto usando CVS e dopo una fusione ho centinaia di conflitti.Nessuno dei conflitti rappresenta un problema (si tratta di modifiche non importanti come risultato delle differenze di espansione delle parole chiave sul tronco e sul ramo).

So che non sono state apportate modifiche ai file poiché si tratta semplicemente dell'unione di un ramo del fornitore nel trunk.Alcune dozzine di file sono stati ispezionati casualmente per convalidarlo.

Esiste un modo rapido per risolvere tutti i conflitti senza eseguirli manualmente?(Ho TortoiseCVS, WinCVS e la riga di comando a mia disposizione).

È stato utile?

Soluzione 3

ho intenzione di rispondere alla mia domanda come la soluzione suggerita da EMACS @jesup era impraticabile per qualcuno che non ha usato Emacs in 15 anni!

Nel mio caso, perché sapevo che l'unico conflitto era per l'espansione delle $ Log $ parole chiave e non ho veramente a cuore il contenuto dei commenti. Ho visto due possibili soluzioni:

  1. tornare alla importazione della fonte fornitore e assicurare che l'espansione parola chiave è disabilitato e rifare l'unione.

  2. essere coraggiosi e copiare tutti i file del fornitore sui file di conflitto (risolvendo così il conflitto). Nel mio caso, ho saputo che non ci sono state modifiche apportate da noi questa è stata una scelta senza rischi.

Sono andato con 2. confronto A basato su regole utilizzando BeyondCompare confermato tutti i file aveva solo cambiamenti 'non importanti'.

Altri suggerimenti

si può fare di nuovo la fusione?

fare un

  

cvs update -kk

prima della fusione non si espanderà le parole chiave.
L'unica parola chiave che sarà un problema è il $ Log uno

Si potrebbe programmare una macro per farlo in Emacs senza troppi problemi - se siete abituati a emacs / elisp, o se probabilmente potrebbe fare senza elisp utilizzando una macro di tastiera in emacs, quindi utilizzando ^ u ^ u ^ u ^ u ^ u ^ x ^ e (tastiera macro ripetizione (^ x ^ e) 1024 volte, ogni ^ u aumenta il valore di 4x). La macro sarebbe una semplice ripetizione dei comandi necessari per risolvere un conflitto nel file. Si potrebbe anche caricare tutti i file con conflitti in buffer, quindi usare elisp o forse una macro tastiera per risolvere i conflitti poi passare al buffer successivo e ripetere.

Non sarei sorpreso se c'è un modo più semplice, ma questo dovrebbe funzionare. E anche se si dispone di caricare tutti i file in buffer e quindi eseguire la macro della tastiera, si Cando che e da fare in un tempo relativamente breve.

Gli 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)

Ora avete tutte le centinaia di file in Emacs buffer, ed è possibile impostare una macro per afferrare il buffer successivo, risolvere i conflitti e salvarlo -. Poi ripetere che macro N volte

Ecco un programma C++ che ho scritto per fare questo.Si compila in Visual Studio 2008 Express e probabilmente in qualsiasi altro compilatore.

Questo input output avviene tramite reindirizzamento, il che forse non è così conveniente, ma puoi scrivere un file cmd per chiamarlo, come ad esempio

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

Il codice è

// 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:Potresti voler verificare il tuo output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top