我正在使用CVS,合併之後,我有數百個衝突。沒有任何衝突是問題(由於主幹和分支上的關鍵字擴展差異,它們不重要)。解決質量衝突問題
我知道沒有對文件進行任何更改,因爲這只是將供應商分支合併到主幹中。隨機檢查幾十個文件來驗證這一點。
是否有快速解決所有衝突的方法,而無需手動執行每個衝突? (我擁有TortoiseCVS,WinCVS和我可以使用的命令行)。
我正在使用CVS,合併之後,我有數百個衝突。沒有任何衝突是問題(由於主幹和分支上的關鍵字擴展差異,它們不重要)。解決質量衝突問題
我知道沒有對文件進行任何更改,因爲這只是將供應商分支合併到主幹中。隨機檢查幾十個文件來驗證這一點。
是否有快速解決所有衝突的方法,而無需手動執行每個衝突? (我擁有TortoiseCVS,WinCVS和我可以使用的命令行)。
我要回答我自己的問題,因爲@ jesup提出的EMACS解決方案對於15年內沒有使用過EMACS的人來說是不切實際的!
就我而言,因爲我知道唯一的衝突是在$ LOG $關鍵字的擴展中,並且我並不真正關心評論的內容。我看到兩種可能的解決方案:
回到供應商源的導入,並確保禁用關鍵字擴展並重新進行合併。
勇敢並將所有供應商文件複製到衝突文件上(從而解決衝突)。就我而言,我知道我們沒有做出任何改變,這是一個沒有風險的選擇。
我去了2.基於規則的比較使用BeyondCompare確認所有的文件只有'不重要'的變化。
你可以編寫一個宏來在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次。
你能再次合併嗎?
做
CVS合併這不會擴大關鍵字之前更新-kk
。
將是一個問題的唯一關鍵是$ Log一個
這是我寫的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;
}
免責聲明:您可能想要驗證您的輸出。