Может ли Mercurial сделать обратный патч? - PullRequest
10 голосов
/ 26 ноября 2010

Сценарий: я «унаследовал» программу, хранящуюся в Mercurial, которая работает в моей системе только с конкретными настройками для определенных файлов, которые зарегистрированы. Я не хочу проверить эти настройки в .

Мое самое последнее решение для этого - создать файл ртутного патча (hg diff> patchfile), содержащий эти настройки; когда мне нужно будет проверить свои изменения, я просто применю исправление в обратном порядке, зафиксирую и повторно применим исправление. (Если бы у меня был полный контроль над источником, я бы просто переместил все эти маленькие настройки в один файл конфигурации, который не находится под контролем версии, поместив «образец» файла конфигурации под контроль версии)

К сожалению, похоже, что хотя команда GNU patch поддерживает флаг --reverse, она не поддерживает многофайловый diff-формат hg как отдельный файл патча (или, может быть, так и есть, и я просто не знаю, переключатели для этого?). OTOH, hg имеет свою собственную команду patch, которая может применить diff, но не поддерживает какой-либо флаг reverse.

Итак, мой вопрос состоит из двух частей:

  1. Как следует сделать это в Mercurial? Конечно, держаться за «патч-твик» - не единственный способ справиться с этой ситуацией. Может быть, в Mercurial есть плагин или что-то встроенное для таких временных, неустранимых изменений.
  2. Помимо того, как все должно быть сделано , есть ли какой-нибудь способ отменить применение такого ртутного diff-патча к ртутному репо, как этот? В других ситуациях такая функциональность была бы полезна.

Ответы [ 2 ]

21 голосов
/ 27 ноября 2010

Команда Mercurial patch (на самом деле import) не поддерживает реверс, но hg diff поддерживает.Используйте --reverse для этого, и у вас будет обратный патч, который может применить Mercurial.

Однако то, что вы описываете, является очень распространенным рабочим процессом в стиле вендора, который Mercurial может лучше поддерживать, используя функциичем diff и patch.

В частности, Mercurial Queues делает именно то, что вы хотите.

1 голос
/ 09 февраля 2018

Я обнаружил - обратный подход не работает, если у вас есть репо. т.е.

 hg diff --reverse -S

. В случае, если это кому-нибудь поможет, этот едва протестированный скрипт, похоже, сделает свою работу:

#!/bin/bash

DIRS="$*"

if [[ $DIRS = "" ]]; then
    DIRS=$(echo *)
fi

for arg in $DIRS; do
    arg=$(echo $arg | sed 's/^\.\/*//g')
    repo=$(echo $arg | cut -d'/' -f-1)

    grep -q "^$repo = " .hgsub 2>/dev/null
    if [ $? -eq 0 ]; then
        if [ -d $repo ]; then
            cd $repo
            hg diff --reverse | sed -e "s;--- a;--- a/$repo;g" -e "s;+++ b;--- b/$repo;g"
            cd ..
        else
            echo Error, unknown repo $repo
        fi
    else
        hg diff $arg --reverse
    fi
done
...