Mercurial에서는 특정 파일에 리버스 패치를 어떻게 적용합니까?

StackOverflow https://stackoverflow.com/questions/1086222

  •  23-08-2019
  •  | 
  •  

문제

와 연관되다 Mercurial : 한 repo에서 분기간에 하나의 파일 병합 그 파일이 백업중인 개정의 많은 참가자 중 하나이지만 단일 파일에서 백 아웃 작업을 수행하려고합니다.

HG는 변경 사항이있는 도구이기 때문에 파일에서 작동하고 싶지 않습니다.

내가 찾을 수있는 가장 가까운 곳은 HG Export를 사용하여 diff를 만들고, diff를 손으로 편집 한 다음, hg 가져 오기에 파일을 반대 순서로 패치하는 것이 가장 좋습니다.

.. 그러나 나는이 성가신 상황에 부딪쳤다 http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html -리버스 옵션이 있다고 주장합니다 hg patch 없을 때.

따라서 내가 생각할 수있는 가장 가까운 것은 위와 같이 손으로 편집 된 패치를 생성 한 다음 바닐라 패치 -r를 사용하여 리버스 패치를 적용하는 것입니다.

그만큼 hg backout 명령은 여기서 유용한 것처럼 보이지만 실제로는 붉은 청어입니다.

더 나은 방법이 있어야합니까?

도움이 되었습니까?

해결책

당신은 그것을 사용하여 그것을 할 수 있습니다 -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

샘플 출력 :

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 <ry4an@mini>
date:        Mon Sep 14 12:17:23 2009 -0500
files:       file1
description:
remove spaces from line1

다른 팁

내가 할 일은 다음과 같습니다. 팁 개정의 신선한 클론을 사용하십시오.

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}

백 아웃을 병합 한 후 커밋 전과 소송 전. 두 번째로, 백 아웃 커밋을 유지하기를 원하기 때문에 클론에서 작업 할 필요가 없습니다.

귀하가 사용하는 방법의 선택은 특정 파일 변경의 변경 사항의 일부가 얼마나 큰지에 달려 있다고 생각합니다.

리버드 명령을 사용하십시오.

hg revert -r1 file

이렇게하면 개정 1의 파일 내용을 버전으로 되돌려 야합니다. 그런 다음 더 이상 편집하고 정상적으로 커밋 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top