質問
CVS を使用していますが、マージ後に何百もの競合が発生します。競合はどれも問題ではありません (これらは、トランクとブランチでのキーワード拡張の違いの結果として生じる重要ではない変更です)。
これは単にベンダー ブランチをトランクにマージしただけであるため、ファイルには変更が加えられていないことがわかります。これを検証するために、数十のファイルがランダムに検査されました。
それぞれを手動で実行せずに、すべての競合を簡単に解決する方法はありますか?(TortoiseCVS、WinCVS、およびコマンドラインを自由に使用できます)。
解決 3
@jesup が提案した EMACS ソリューションは、15 年間 EMACS を使用していない人にとっては実用的ではなかったので、私自身の質問に答えます。
私の場合、唯一の競合は $LOG$ キーワードの展開にあるとわかっていたので、コメントの内容はあまり気にしませんでした。考えられる解決策は 2 つあります。
ベンダー ソースのインポートに戻り、キーワード展開が無効になっていることを確認し、マージをやり直します。
勇気を出して、すべてのベンダー ファイルを競合ファイルの上にコピーしてください (これにより、競合が解決されます)。私の場合、私たちは何も変更を加えておらず、これはリスクのないオプションであることを知っていました。
2で行きました。を使用したルールベースの比較 比較を超えて すべてのファイルに「重要でない」変更のみが含まれていることを確認しました。
他のヒント
あなたは再びマージを行うことができますか?
行う
CVSアップデート-kk
マージする前にこのキーワードを展開しません。
問題となる唯一のキーワードは、$ログものです。
あなたはあまりにも問題なくEmacsでそれを行うには、マクロをプログラムすることができ - あなたはemacsの/ elispのに使用している場合、またはあなたはおそらく使用して、その後、emacsの中でキーボードマクロを使用してelispのせずにそれを行うことができれば、^ U ^ uと^ U ^ U ^ U ^ X ^ E()^ X ^ E(1024回キーボードマクロを繰り返し、各^ uは4倍、カウントを増加させます)。マクロは、ファイル内の1つの競合を解決するために必要なコマンドの簡単な繰り返しになります。また、その後、競合が、次のバッファに切り替えて解決し、そしてそれを繰り返すようにelispのまたは多分キーボードマクロを使用し、バッファに競合を持つすべてのファイルを読み込むことができます。
もっと簡単な方法があります場合、私は驚かないだろうが、これは動作します。あなたがバッファにすべてのファイルをロードし、キーボードマクロを実行する必要がある場合でも、あなたがそれをCANDO、比較的短時間で行うことがます。
疑似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回
ここで私はこれを行うために書いた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;
}
免責事項:あなたの出力を確認したい場合があります。