0

我正在使用 CVS,合并后,我有数百个冲突。这些冲突都不是问题(由于主干和分支上的关键字扩展差异,它们是不重要的更改)。

我知道没有对文件进行任何更改,因为这只是将供应商分支合并到主干中。已经随机检查了几十个文件以验证这一点。

有没有一种快速解决所有冲突的方法,而无需手动完成每个冲突?(我可以使用 TortoiseCVS、WinCVS 和命令行)。

4

4 回答 4

1

你能再做一次合并吗?

做一个

简历更新-kk

在合并之前,这不会扩展关键字。
唯一有问题的关键字是 $Log 一个

于 2009-06-02T19:12:27.637 回答
0

您可以在 Emacs 中编写一个宏来执行此操作而没有太多麻烦 - 如果您习惯于 emacs/elisp,或者您可能可以在没有 elisp 的情况下使用 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 次。

于 2009-05-20T15:30:54.650 回答
0

我将回答我自己的问题,因为@jesup 建议的 EMACS 解决方案对于 15 年没有使用 EMACS 的人来说是不切实际的!

就我而言,因为我知道唯一的冲突在于 $LOG$ 关键字的扩展,我并不真正关心评论的内容。我看到了两种可能的解决方案:

  1. 返回供应商源的导入并确保禁用关键字扩展并重做合并。

  2. 勇敢地将所有供应商文件复制到冲突文件上(从而解决冲突)。就我而言,我知道我们没有做出任何改变,这是一个没有风险的选择。

我选择了 2。使用BeyondCompare进行的基于规则的比较确认所有文件都只有“不重要”的更改。

于 2009-05-21T15:08:58.793 回答
0

这是我为此编写的一个 C++ 程序。它在 Visual Studio 2008 Express 中编译,也可能在任何其他编译器中编译。

这个输入输出是通过redirect,可能不太方便,但是可以写个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;
}

免责声明:您可能想要验证您的输出。

于 2013-08-07T22:25:27.740 回答