Массовое разрешение конфликтов - PullRequest
0 голосов
/ 20 мая 2009

Я использую CVS, и после слияния у меня сотни конфликтов. Ни один из конфликтов не является проблемой (это несущественные изменения в результате различий в расширении ключевых слов на внешней линии и ветви).

Я знаю, что в файлы не было внесено никаких изменений, поскольку это просто слияние ветки поставщика в транк. Несколько десятков файлов были случайно проверены, чтобы подтвердить это.

Есть ли быстрый способ разрешить все конфликты, не делая каждый вручную? (В моем распоряжении TortoiseCVS, WinCVS и командная строка).

Ответы [ 4 ]

1 голос
/ 02 июня 2009

Вы можете сделать слияние снова?

сделать

cvs update -kk

до слияния ключевые слова не будут расширяться.
Единственное ключевое слово, которое будет проблемой, это $ Log one

0 голосов
/ 08 августа 2013

Вот программа на C ++, которую я написал для этого. Компилируется в Visual Studio 2008 Express и, возможно, в любом другом компиляторе.

Этот входной вывод осуществляется через перенаправление, что, возможно, не очень удобно, но вы можете написать cmd-файл для вызова, например

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

Код

// 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;
}

Отказ от ответственности: вы можете проверить свои выходные данные.

0 голосов
/ 21 мая 2009

Я собираюсь ответить на свой вопрос, поскольку решение EMACS, предложенное @jesup, было непрактичным для тех, кто не использовал EMACS в течение 15 лет!

В моем случае, потому что я знал, что единственный конфликт был в расширении ключевых слов $ LOG $, и я не особо заботился о содержании комментариев. Я видел два возможных решения:

  1. вернитесь к импорту источника поставщика и убедитесь, что расширение ключевого слова отключено, и повторите объединение.

  2. будьте храбрыми и скопируйте все файлы вендоров поверх файлов конфликтов (таким образом разрешив конфликт). В моем случае я знал, что мы не вносили никаких изменений, это был вариант без риска.

Я пошел с 2. Сравнение на основе правил с использованием BeyondCompare подтвердило, что все файлы имели только «незначительные» изменения.

0 голосов
/ 20 мая 2009

Вы можете запрограммировать макрос, чтобы он делал это в Emacs без особых проблем - если вы привыкли к emacs / elisp, или если вы, вероятно, могли бы сделать это без elisp, используя Keyboard Macro в emacs, то используйте ^ u ^ u ^ u ^ u ^ u ^ x ^ e (повторить макрос клавиатуры (^ x ^ e) 1024 раза; каждый ^ u увеличивает счет в 4 раза). Макрос будет простым повторением команд, необходимых для разрешения одного конфликта в файле. Вы также можете загрузить все файлы с конфликтами в буферы, затем использовать elisp или, возможно, макрос клавиатуры для разрешения конфликтов, затем переключиться на следующий буфер и повторить это.

Я не удивлюсь, если есть более простой способ, но это сработает. И даже если вам нужно загрузить все файлы в буферы, а затем запустить макрос клавиатуры, вам это нужно, и все будет сделано за относительно короткое время.

Псевдо-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)

Теперь у вас есть все сотни файлов в буферах emacs, и вы можете настроить макрос для захвата следующего буфера, разрешения конфликтов и сохранения его - затем повторите этот макрос N раз.

...