2009-07-06 2 views
18

Связано с Mercurial: Merging one file between branches in one repo, я пытаюсь выполнить операцию резервного копирования в одном файле, хотя этот файл был одним из многих участников ревизии.В mercurial, как применить обратный патч к определенному файлу?

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

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

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

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

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

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

+2

The -reverse опция для * patch *, not * hg patch *. – balpha

ответ

22

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

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

Пример сценария: выходной

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 

Sample :

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 

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

$ 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 
+0

Я думаю, что я понимаю это решение, но этот случай кажется более простым, чем мой, поскольку здесь вы отступаете (в одном из файлов) с изменением наконечника, в то время как balpha имеет дело с моим более общим случаем, помогающим сохранить историческое изменение. – djsadinoff

+1

Naw, это будет отлично работать для набора советов без подсказок, хотя в конце вам понадобится «hg merge». Тем не менее, вы все равно получите диаграмму истории, которая точно отражает то, что произошло, и изменяет исходное происхождение, в отличие от копии, сделанной с помощью balpha, которая даст линейный журнал изменений. –

+0

Прохладный. Если бы вы отправили пример с поддержкой скрытого изменения, я бы отметил его правильно. – djsadinoff

6

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

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 и этим фиксатором. Если вы хотите ртутный помнить об этом, вместо того, чтобы сделать

hg revert {all files except the one in question} 

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

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

3

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

hg revert -r1 file 

Это должно восстановить содержимое файла в версии в правке 1. Вы можете дополнительно отредактировать его и совершить в обычном режиме.

+0

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

Смежные вопросы