Frage

Ich bin mit CVS und nach einer Zusammenführung, ich habe hunderte von Konflikten. Keiner der Konflikte ist ein Thema (sie unwesentliche Veränderungen als Folge der Keyword-Erweiterung Unterschiede auf dem Stamm und Zweig sind).

Ich weiß, dass keine Änderungen an den Dateien vorgenommen worden, da dies einfach eine Zusammenführung eines Lieferanten-Zweig in den Stamm. Ein paar Dutzend Dateien wurden diese zufällig kontrolliert zu validieren.

Gibt es einen schnellen Weg, um all die Konflikte zu lösen, ohne jeden manuell zu tun? (Ich habe TortoiseCVS, WinCVS und die Befehlszeile zu meiner Verfügung).

War es hilfreich?

Lösung 3

Ich werde meine eigene Frage als die EMACS Lösung von @jesup vorgeschlagen beantworten war unpraktisch für jemanden, der nicht EMACS in 15 Jahren verwendet hat!

In meinem Fall, weil ich wusste, dass das der einzige Konflikt war in den Ausbau der $ LOG $ keywords und ich habe wirklich kümmern sich nicht um den Inhalt der Kommentare. Ich sah zwei mögliche Lösungen:

  1. zurück zum Import des Verkäufers Quelle und stellen Sie sicher, dass die Keyword-Erweiterung deaktiviert, und wiederholen Sie die merge.

  2. mutig sein und all die Herstellerdateien über die Konfliktdateien kopieren (so den Konflikt zu lösen). In meinem Fall, ich wusste, dass es von uns gemacht dies war eine risikofreie Option.

  3. keine Änderungen waren

ging ich mit 2. Eine regelbasierte Vergleich mit BeyondCompare alle Dateien bestätigt nur 'unwichtige' Änderungen hatte.

Andere Tipps

können Sie tun, um die Zusammenführung wieder?

do a

  

cvs update -KK

vor der Zusammenführung wird dies die Schlüsselwörter nicht erweitern.
Das einzige Schlüsselwort, das ein Problem sein wird, ist das $ Log ein

Sie können ein Makro programmieren, dass es ohne allzu viel Mühe in Emacs zu tun - wenn Sie Emacs / elisp gewohnt sind, oder wenn Sie es wahrscheinlich ohne elisp tun könnte eine Tastatur Makro in Emacs verwenden, dann mit ^ u ^ u ^ u ^ u ^ u ^ x ^ e (repeat-Tastatur-Makro (^ x ^ e) 1024 mal, jeder ^ u die Zählung von 4x erhöht). Das Makro wäre eine einfache Wiederholung der Befehle benötigten einen Konflikt in der Datei zu lösen. Sie können auch alle Dateien mit Konflikten in Puffer laden, dann verwenden elisp oder vielleicht eine Tastatur Makro-Konflikte zu lösen dann auf den nächsten Puffer wechseln, und wiederholen Sie das.

würde ich nicht überrascht, wenn es ein einfacher Weg ist, aber dies funktionieren würde. Und selbst wenn Sie alle Dateien in Puffer haben zu laden und dann die Tastatur-Makro ausführen, cando Sie, dass und in relativ kurzer Zeit durchgeführt werden.

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)

Jetzt haben Sie alle Hunderte von Dateien in Emacs-Puffern, und Sie können ein Makro einrichten, um den nächsten Puffer zu greifen, Konflikte zu lösen, und speichern Sie es -. Wiederholen Sie dann , dass Makro-N-mal

Hier ist ein C ++ Programm, das ich schrieb, dies zu tun. Es kompiliert in Visual Studio 2008 Express, und wahrscheinlich andere Compiler.

Dieser Eingang Ausgang ist über Umleitung, die vielleicht nicht so bequem ist, aber Sie können eine cmd-Datei schreiben es zu nennen, wie

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

Der Code ist

// 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:. Vielleicht möchten Sie Ihre Ausgabe überprüfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top