代码之家  ›  专栏  ›  技术社区  ›  Ray Hayes

解决群体冲突

  •  0
  • Ray Hayes  · 技术社区  · 17 年前

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

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

    是否有一种快速解决所有冲突的方法,而不手动执行每个冲突?(我有Tortoisecvs、Wincvs和命令行可供我使用)。

    4 回复  |  直到 13 年前
        1
  •  1
  •   Instance Hunter    17 年前

    你能再合并一次吗?

    做一个

    CVS更新- KK

    在合并之前,不会展开关键字。
    唯一有问题的关键字是$log1

        2
  •  0
  •   jesup    17 年前

    您可以在Emacs中编写宏来执行该操作,而不会有太大的麻烦-如果您习惯使用Emacs/Elisp,或者如果您可能可以在Emacs中使用键盘宏而不使用Elisp,则使用^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次。

        3
  •  0
  •   Ray Hayes    17 年前

    我要回答我自己的问题,因为@jesup提出的Emacs解决方案对于15年没有使用过Emacs的人来说是不切实际的!

    在我的例子中,因为我知道唯一的冲突是扩展$log$关键字,而我并不真正关心注释的内容。我看到了两种可能的解决方案:

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

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

    我和2一起去了。基于规则的比较使用 BeyondCompare 已确认所有文件只有“不重要”更改。

        4
  •  0
  •   John Henckel    13 年前

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

    这个输入输出是通过重定向的,这可能不太方便,但是您可以编写一个命令文件来调用它,例如

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

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

    推荐文章