Подтвердить что ты не робот

Git слияние с использованием рекурсивной стратегии и терпения

Как объединить ветку с git с использованием параметра терпения, предоставляемого рекурсивной стратегией? я использую git версия 1.7.3.1.msysgit.0

Даже документы несовместимы и, что еще, отличаются от того, что выдает фактическая команда.

Документы говорят:

git merge [-s <strategy>] [-X <strategy-option>] <commit>

и далее в тексте:

-X <option>

(без пробела)

Вывод команды:

-X, --strategy-option <option=value>

option for selected merge strategy

Итак, я попробовал пару версий со следующими результатами:

$ git merge -s recursive -Xpatience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -X patience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -Xpatience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge --strategy-option patience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -X option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

$ git merge --strategy-option option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

$ git merge option=patience sourceBranch
fatal: 'option=patience' does not point to a commit

$ git merge -X option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

Похоже, что опция не реализована...

4b9b3361

Ответ 1

Параметр --patience для git merge-recursive был введен в commit 58a1ece478c6038a7eb0b6e494d563bd5e6d5978. Вы можете узнать в клоне git.git, какие версии содержат это изменение с помощью git tag --contains 58a1ece478:

v1.7.4
v1.7.4-rc0
v1.7.4-rc1
v1.7.4-rc2
v1.7.4-rc3
v1.7.4.1

Поэтому я подозреваю, что вы используете слишком старую версию mSysGit. Теперь доступна версия для просмотра версии 1.7.4 - я думаю, вы должны попробовать эту.

Я только что попробовал это с помощью git версии 1.7.4, и для меня работает следующий синтаксис командной строки:

git merge -s recursive -X patience other-branch

Ответ 2

I см. здесь патч, представляющий параметр терпения для стратегии рекурсивного слияния, основываясь на Git1.7.2.2, но я не см. в любой из последующих заметок.

Тем не менее алгоритм ограничения терпения представлен с 2009 года и подробно описан здесь.

> grep -i patience *.c
diff.c: else if (!strcmp(arg, "--patience"))
diff.c:         DIFF_XDL_SET(options, PATIENCE_DIFF);
merge-recursive.c:      else if (!strcmp(s, "patience"))
merge-recursive.c:              o->xdl_opts |= XDF_PATIENCE_DIFF;

Команда слияния должна понимать эту опцию... но эта функция ниже, кажется, никогда не вызывается (нигде в merge-recursive.c или в любом другом файле *.c!):

int parse_merge_opt(struct merge_options *o, const char *s)
{
    if (!s || !*s)
        return -1;
    if (!strcmp(s, "ours"))
        o->recursive_variant = MERGE_RECURSIVE_OURS;
    else if (!strcmp(s, "theirs"))
        o->recursive_variant = MERGE_RECURSIVE_THEIRS;
    else if (!strcmp(s, "subtree"))
        o->subtree_shift = "";
    else if (!prefixcmp(s, "subtree="))
        o->subtree_shift = s + strlen("subtree=");
    else if (!strcmp(s, "patience"))
        o->xdl_opts |= XDF_PATIENCE_DIFF;
    else if (!strcmp(s, "ignore-space-change"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
    else if (!strcmp(s, "ignore-all-space"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE;
    else if (!strcmp(s, "ignore-space-at-eol"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
    else if (!strcmp(s, "renormalize"))
        o->renormalize = 1;
    else if (!strcmp(s, "no-renormalize"))
        o->renormalize = 0;
    else if (!prefixcmp(s, "rename-threshold=")) {
        const char *score = s + strlen("rename-threshold=");
        if ((o->rename_score = parse_rename_score(&score)) == -1 || *score != 0)
            return -1;
    }
    else
        return -1;
    return 0;
}

Сообщение об ошибке "Неизвестная опция" выводится только функцией handle_options в git.c.
И XDF_PATIENCE_DIFF больше не отображается в источниках git (1.7.4)... так что да, я не знаю, как это можно реализовать для слияния.