我正在使用CVS,合并后,我有数百个冲突。没有任何冲突是一个问题(由于主干和分支上的关键字扩展差异,它们是不重要的更改)。
我知道没有对文件进行任何更改,因为这只是将供应商分支合并到主干中。随机检查了几十个文件以验证这一点。
是否有快速解决所有冲突而无需手动执行每个冲突的方法? (我有TortoiseCVS,WinCVS和命令行)。
答案 0 :(得分:1)
你可以再次进行合并吗?
做一个
合并前cvs update -kk
不会扩展关键字 唯一会成为问题的关键字是$ Log one
答案 1 :(得分:0)
您可以编程宏来在Emacs中进行操作而不会有太多麻烦 - 如果您已经习惯了emacs / elisp,或者如果您可以在emacs中使用键盘宏而没有使用elisp,那么使用^ 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次。 / p>
答案 2 :(得分:0)
我将回答我自己的问题,因为@jesup建议的EMACS解决方案对于15年内没有使用EMACS的人来说是不切实际的!
在我的情况下,因为我知道唯一的冲突是$ LOG $关键字的扩展,我并不真正关心评论的内容。我看到了两种可能的解决方案:
返回供应商来源的导入,并确保禁用关键字扩展并重做合并。
勇敢并将所有供应商文件复制到冲突文件上(从而解决冲突)。就我而言,我知道我们没有做出任何改变,这是一个无风险的选择。
我选择2.使用BeyondCompare进行基于规则的比较,确认所有文件只有“不重要”的更改。
答案 3 :(得分: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;
}
免责声明:您可能需要验证输出。