command line 트리 이미 커밋되지 않은 변경 사항이있을 때 hg 명령 줄을 사용하여 여러 패치를 적용하는 방법?




소스 트리 계정 변경 (4)

Mercurial 에서 패치를 적용하기 위해 다음 명령을 사용합니다.

hg import patch.diff --no-commit

그러나 다음과 같이 한 번에 여러 패치를 적용하려고하면 멋지게 작동합니다.

hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...

두 번째 커밋 후에이 오류 메시지가 나타납니다.

abort: uncommitted changes

SourceTree 에서 똑같이 (patch1 다음에 patch2를 적용하고 "작업 복사본 파일 수정"을 선택하면) 작동합니다. 두 개의 패치가 작업 복사본에 적용되고, patch1과 patch2의 변경 사항이 함께 / 결합됩니다.

hg 명령 줄을 사용하여 동일한 작업을 수행하는 방법은 무엇입니까?


나는 이것을하기위한 더 우아한 방법이있을 것이라고 생각한다.

(역 패치를 먼저 추출하려는 경우) :

hg diff -c xxx --reverse > 1.diff

현재 팁이 txxx라고 가정합니다.

hg import 1.diff #creates changeset cxxx1
Hg import 2.diff #creates changeset cxxx2
Hg import 3.diff #creates changeset cxxx3
hg rebase -r cxxx1::cxxx3 -d txxx --collapse

Mercurial 제작자가 설계 한 동작입니다. 작업 복사본에서 커밋되지 않은 변경 사항을 "수동으로 만든"경우, hg import 가 자동으로 패치를 적용하지 않도록하고 변경 사항과 패치 변경 내용을 잘못된 로그 메시지와 두 변경 사항이 서로 얽혀 있습니다.

hg help import 이유는 다음과 같습니다.

Because import first applies changes to the working directory, import will
abort if there are outstanding changes.

가져 오기 명령은 패치를 적용하는 것보다 변경 사항 ( hg export 에서 데이터를 가져올 때 메타 데이터 포함)을 가져 오는 데 더 유용합니다. 작업 카피에 독자적인 변경이있는 경우, 예를 들어 hg import --bypass 사용할 수 있습니다. 커밋이 작업 카피가 아닌 저장소에 직접 적용되기 때문에 에러는 일어나지 않습니다. (참고 :하지만 변경 사항을 커밋하는 경우 두 개의 머리가 생기므로 병합해야합니다. :-).

Unix 시스템 용 명령 줄을 사용하는 솔루션은 hg import 대신 직접 patch 명령을 사용하는 것입니다. 그러면 로컬 수정 사항에 대한 검사가 수행되지 않기 때문입니다. 예를 들어,

for i in 1 2 etc.
do 
   patch -p1 < patch$i.diff
done
hg commit ...

Unix 시스템이 아닌 경우 shelve 확장을 설치하고 전역 구성 파일 (mercurial.ini)에서 활성화 한 다음 shelve 를 사용하여 패치 하나를 병합 처리하여 순수한 Mercurial 솔루션을 가질 수도 있습니다.

hg import --no-commit patch1.diff
hg shelve
hg import --no-commit patch2.diff
hg unshelve
etc.

충돌이 발생하면 shelve 를 감지하고 해결해야하며 shelve 에게 --continue 옵션으로 해결된다는 것을 알려야합니다.

희망이 도움이됩니다.


여기 나를 위해 일한 무엇입니까 (Windows 솔루션), 아이디어는 크리스토프 뮬러 대답에서 잡았습니다 :

copy /b "patch01.diff" + "patch02.diff" + ... + "patchXX.diff" "all.diff"

hg import "all.diff" --no-commit

모든 패치를 하나의 큰 파일로 연결 한 다음 적용하면됩니다.


한 가지 가능한 해결책은 Mercurial 대기열 을 사용하는 것입니다 (참고 -이 확장은 "종종 비추천으로 간주됩니다.하지만 아직 사용되지 않으며 Mercurial이 사전 설치되어 있습니다).

이전에 MQ를 사용하지 않았다면, 약간 복잡하다면 매우 편리합니다. 그러나 효과적으로 패치 대기열을 만들 수 있습니다. 푸시, 팝, 재 배열 등이 가능합니다.

다음과 같이 문제를 해결하는 데 사용할 수 있습니다.

:: if you don't already have MQ initialised for the repo, do so
hg init --mq

:: import the patches you want as queue entries
hg qimport -P patch1.diff
hg qimport -P patch2.diff
hg qimport -P patch3.diff

-P 옵션은 변경 사항을 가져올 때 변경 사항을 푸시합니다. 즉, 변경 사항을 올바르게 적용했는지 확인할 수 있습니다. MQ로 가져온 모든 패치를 가져 왔을 때, 모든 패치를 띄우십시오 (아무 것도 적용되지 않았기 때문에 시작한 곳으로 되돌아 왔습니다).

:: go back to no patches applied, and create a new patch at the front of the queue
hg qpop --all
hg qnew -m "Your planned commit message" combined_patches
:: fold the named patches into the current one
hg qfold patch1 patch2 patch3

그런 다음 결과 패치가 만족 스럽다면 "실제"변경 세트로 변환하십시오.

:: convert combined_patches into a "real" changeset
hg qfinish combined_patches




patch