2009-05-20 74 views
0

我正在使用CVS,合并之后,我有数百个冲突。没有任何冲突是问题(由于主干和分支上的关键字扩展差异,它们不重要)。解决质量冲突问题

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

是否有快速解决所有冲突的方法,而无需手动执行每个冲突? (我拥有TortoiseCVS,WinCVS和我可以使用的命令行)。

回答

0

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

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

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

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

我去了2.基于规则的比较使用BeyondCompare确认所有的文件只有'不重要'的变化。

0

你可以编写一个宏来在Emacs中完成,而不会有太多的麻烦 - 如果你习惯了emacs/elisp,或者如果你可能没有elisp在emacs中使用键盘宏,那么可以使用^ u^(重复键盘宏(^ 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次。

1

你能再次合并吗?

CVS合并这不会扩大关键字之前更新-kk


将是一个问题的唯一关键是$ Log一个

0

这是我写的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; 
} 

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