0

私は CVS を使用していますが、マージ後に何百もの競合が発生しています。競合はどれも問題ではありません (トランクとブランチでのキーワード展開の違いによる重要でない変更です)。

これは単にベンダー ブランチをトランクにマージしただけなので、ファイルに変更が加えられていないことはわかっています。これを検証するために、数十個のファイルがランダムに検査されました。

1 つずつ手動で行うことなく、すべての競合をすばやく解決する方法はありますか? (TortoiseCVS、WinCVS、およびコマンドラインを自由に使用できます)。

4

4 に答える 4

1

マージをやり直すことはできますか?

する

cvs update -kk

マージする前に、これはキーワードを展開しません。
問題になる唯一のキーワードは $Log です

于 2009-06-02T19:12:27.637 に答える
0

Emacsでそれを行うためにマクロをプログラムすることができます-emacs/elispに慣れている場合、またはemacsでキーボードマクロを使用してelispなしでそれを行うことができる場合は、^ u ^ u ^u^を使用してくださいu ^ u ^ x ^ e(キーボードマクロ(^ x ^ e)を1024回繰り返します。^uごとにカウントが4倍になります)。マクロは、ファイル内の1つの競合を解決するために必要なコマンドの単純な繰り返しになります。競合のあるすべてのファイルをバッファにロードしてから、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回繰り返します。

于 2009-05-20T15:30:54.650 に答える
0

@jesup が提案した EMACS ソリューションは、15 年間 EMACS を使用していない人にとっては実用的ではなかったため、私自身の質問に答えます。

私の場合は、唯一の競合が $LOG$ キーワードの展開にあることを知っていたので、コメントの内容はあまり気にしませんでした。私は2つの可能な解決策を見ました:

  1. ベンダー ソースのインポートに戻り、キーワード展開が無効になっていることを確認して、マージをやり直してください。

  2. 勇気を出して、すべてのベンダー ファイルを競合ファイルにコピーします (競合を解決します)。私の場合、私たちが変更を加えていないことはわかっていましたが、これはリスクのないオプションでした.

私は 2 を採用しました。BeyondCompareを使用したルールベースの比較により、すべてのファイルに「重要でない」変更のみが含まれていることが確認されました。

于 2009-05-21T15:08:58.793 に答える
0

これを行うために私が書いた 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;
}

免責事項: 出力を確認することをお勧めします。

于 2013-08-07T22:25:27.740 に答える