سؤال

أنا أستخدم CVS وبعد دمج، لدي مئات الصراعات. لا توجد أي من النزاعات مشكلة (إنها تغييرات غير مهمة نتيجة لفروق توسيع الكلمة الرئيسية في الجذع والفرع).

لا أعلم أنه لم يتم إجراء تغييرات على الملفات لأن هذا هو ببساطة دمج فرع البائع في الجذع. تم فحص بعض عشرات الملفات بشكل عشوائي للتحقق من صحة هذا.

هل هناك طريقة سريعة لحل جميع النزاعات دون القيام بكل واحد يدويا؟ (لدي Tortoisecvs و Wincvs وخط الأوامر تحت تصرفي).

هل كانت مفيدة؟

المحلول 3

سأجيب على سؤالي الخاص كحل EMACS الذي اقترحه Jesup كان غير عملي لشخص لم يستخدم emacs في 15 عاما!

في حالتي، لأنني كنت أعرف أن الصراع الوحيد كان في توسيع الكلمات الرئيسية $ سجل Log $ ولم أهتم حقا بمحتوى التعليقات. رأيت حلين ممكنين:

  1. العودة إلى استيراد مصدر البائع وتأكد من تعطيل توسيع الكلمات الرئيسية وإعادة الدمج.

  2. كن شجاعا ونسخ جميع ملفات البائع عبر ملفات التعارض (وبالتالي حل الصراع). في حالتي، كنت أعرف أنه لم تكن هناك تغييرات مقدمة من قبلنا كان هذا خيارا غير مخاطر.

ذهبت مع 2. المقارنة القائمة على القواعد باستخدام testcompare. أكد جميع الملفات على التغييرات فقط "غير مهم".

نصائح أخرى

يمكنك أن تفعل الدمج مرة أخرى؟

أ

تحديث السيرة الذاتية -kk.

قبل دمج هذا لن يقوم بتوسيع الكلمات الرئيسية.
الكلمة الرئيسية الوحيدة التي ستكون مشكلة هي سجل $

يمكنك برمجة ماكرو للقيام بذلك في EMACs دون الكثير من المتاعب - إذا كنت معتادا على EMACS / Elisp، أو إذا كنت قد تقوم بذلك دون Elisp باستخدام لوحة مفاتيح ماكرو في EMACS، فاستخدم ^ u ^ u ^ U ^ U ^ U ^ U ^ u ^ x ^ e (كرر لوحة المفاتيح الماكرو (^ x ^ e) 1024 مرة؛ كل ^ يو يزيد من العد بواسطة 4x). سيكون الماكرو تكرارا بسيطا للأوامر اللازمة لحل تعارض واحد في الملف. يمكنك أيضا تحميل جميع الملفات التي تحتوي على تعارضات إلى مخازن مؤقتة، ثم استخدم ELISP أو ربما ماكرو لوحة المفاتيح لحل النزاعات ثم قم بالتبديل إلى المخزن المؤقت التالي، وكرر ذلك.

لن أتفاجأ إذا كانت هناك طريقة أسهل، لكن هذا سيعمل. وحتى إذا كان عليك تحميل جميع الملفات في المخازن المؤقتة، ثم قم بتشغيل ماكرو لوحة المفاتيح، أنت CARTO الذي ويتم القيام به في وقت قصير نسبيا.

Pseudo-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، ويمكنك إعداد ماكرو للاستيلاء على المخزن المؤقت التالي، وحل التعارضات، وحفظه - ثم كرر الذي - التي ماكرو ن تايمز.

هنا برنامج 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;
}

إخلاء المسئولية: قد ترغب في التحقق من الإخراج الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top