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

В mercurial, как применить обратный патч к определенному файлу?

Относится к Mercurial: объединяя один файл между ветвями в одном репозитории, я пытаюсь выполнить операцию резервного копирования в одном файле, хотя этот файл был одним многие участники пересмотра были отброшены.

HG - это инструмент, ориентированный на изменение набора, который он не хочет работать с файлами.

Ближе всего я мог найти использование экспорта hg для создания diff, вручную отредактировать diff, а затем hg import для исправления файла в обратном порядке.

.., но затем я попал в эту неприятную ситуацию, когда http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html утверждает, что существует опция -reverse для hg patch, когда нет.

Итак, самое близкое, о чем я могу думать, - это создать отредактированный вручную патч, как описано выше, а затем использовать патч-ваниль -R для применения обратного патча.

Команда hg backout показалась бы полезной здесь, но на самом деле это красная селедка.

У GOT есть лучший способ, нет?

4b9b3361

Ответ 1

Вы можете сделать это, используя только аргумент -I (включить имена, соответствующие указанным шаблонам) для резервного копирования с помощью одной строки:

hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID

Пример Script:

hg init testrepo
cd testrepo
echo -e "line1\n\nline3" > file1
echo -e "line1\n\nline3" > file2
hg commit -A -m 'changes to two files'
perl -pi -e 's/line1/line 1/' file1
perl -pi -e 's/line1/line 1/' file2
hg commit -m 'put spaces in line1'
perl -pi -e 's/line3/line 3/' file1
perl -pi -e 's/line3/line 3/' file2
hg commit -m 'put spaces in line3'
hg backout --merge -I file1 -m 'remove spaces from line1' 1

Пример вывода:

adding file1
adding file2
reverting file1
created new head
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3
merging with changeset 3:6d354f1ad4c5
merging file1
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

Результирующее содержимое файла:

file1:line1
file1:line 3
file2:line 1
file2:line 3

обратите внимание, что в файле 1 отсутствует пробел в строке 1 после резервной копии среднего набора изменений, а в подробном журнале отображается только один файл, измененный в резервном копировании:

$ hg log -v -r tip
changeset:   3:6d354f1ad4c5
tag:         tip
parent:      1:906bbeaca6a3
user:        Ry4an Brase <[email protected]>
date:        Mon Sep 14 12:17:23 2009 -0500
files:       file1
description:
remove spaces from line1

Ответ 2

Вот что я буду делать: Используйте новый клон пересмотра подсказки.

hg backout --merge -r revision_where_the_change_happened

чтобы объединить обратные изменения в рабочую копию.

Теперь скопируйте указанный файл в свою обычную рабочую копию и скопируйте

hg commit -m "Reversed the changes to file.h made in revision bla"

и выбросьте клон, который вы создали выше.

Таким образом, mercurial не знает, что существует связь между revision_where_the_change_happened и этим фиксацией. Если вы хотите, чтобы Mercurial запомнил это, вместо этого сделайте

hg revert {all files except the one in question}

после объединения фиксации резервного копирования в рабочую копию и до совершения транзакции. Во-вторых, вам не нужно работать с клоном, потому что вы хотите сохранить фиксацию резервной копии.

Я бы предположил, что выбор того, каким образом вы используете, зависит от того, насколько велика часть изменений, в которой было изменено конкретное изменение файла.

Ответ 3

Используйте команду revert.

hg revert -r1 file

Это должно вернуть содержимое файла версии в версию 1. Затем вы можете отредактировать его и зафиксировать как обычно.