Mercurial에서 제거 된 파일을 복구하려면 어떻게합니까?


100

우연히 CLI가 아닌 GUI를 사용하여 Mercurial 프로젝트의 모든 파일을 제거했습니다.

Revert ok로 회복하고 일부 작업을 잃었습니다. 타임머신이 있으므로 쉽게 돌아갈 수 있습니다. 그러나 그러한 파일을 제거 / 삭제 취소하는 방법이 있습니까? 설명서를 훑어보고 검색했지만 아무것도 볼 수 없습니다. 플러그인이 있습니까?

나는 아마도 여기 내 질문에 대답하고 있지만 파일이 디렉토리에서 사라지고 복구 할 휴지통에 없었으므로 제거가 취소 불가능하다고 가정하고 있습니까?

추신 나는 그것을 알고 hg forget있거나 hg remove -Af디렉토리에서 삭제하지 않고 제거 할 것이지만 내 질문은 내가 만든 오류와 관련이 있습니다.


1
이전 버전을 체크 아웃 할 수 있고 괜찮을 것입니다 (물론 이것은 기록을 다시 쓰지 않은 경우에만 작동합니다)
tback

문제는 내가 커밋하고 편집하고 R (emoved)했다는 것입니다. 그래서 그 시퀀스 후에 예, 이전 커밋을 얻었으므로 다시 돌아가서 타임머신 형태의 백업을 가지고 있으므로 마지막 변경 사항을 가져온 다음 추가 한 다음 커밋 할 수 있습니다. 그러나 백업이 없었다면 변경 사항이 손실되었을 것입니다.
PurplePilot 2010

1
파일 이름 만 검색 할 수있는 관련 질문 (빠름) : stackoverflow.com/questions/1013550/…
Michael Pryor

답변:


152

먼저 hg grep복구하려는 삭제 된 파일을 찾는 데 사용 합니다. 이 명령의 출력은 파일이 있었던 마지막 개정판과 삭제 된 파일의 경로를 보여줍니다. 둘째, 실행 hg revert -r <revision number> <path to deleted file> 삭제 된 파일은 이제 작업 복사본에 있으며 헤드로 다시 커밋 할 준비가됩니다.


5
나를 위해 잘 작동했습니다, 감사합니다. "고의로 삭제 한 파일을 복원하려면 어떻게해야합니까?"에 대한 답을 찾고있었습니다.
nc.

Eclipse에서 파일을 마우스 오른쪽 버튼으로 클릭하여 수행 할 수 있습니다. 팀 선택-> 되돌리기
Emil

3
파일이 포함 된 개정판을 찾는 또 다른 방법은hg log -I '**file.ext'
mpen

2
참고로 : 파일 을 제거한 커밋이 아닌 파일이있는 커밋의 개정 번호를 원합니다 !
Lukas Knuth

8

의견에서 인용 :

저장소를 설정하고 모두 커밋하고 제거한 다음 다시 커밋했습니다.

이 경우 작업 디렉토리를 이전 개정으로 업데이트하면됩니다.

$ hg update -C -r-2

음수 개정 번호를 확인하십시오. 삭제 한 파일이 이전 버전에없는 경우 다음을 사용하여 찾을 수 있습니다.

$ hg log -v

5

이것은 나를 위해 일했습니다.

hg revert -r revision pathToTheFile

4

Mercurial 1.6 이상

삭제 파일의 이름을 아는 경우 다음을 사용하여 쉽게 개정판을 찾을 수 있습니다.

hg log -r "removes('NAME.c')"

그러면 NAME.c (루트에 있음)라는 파일이 삭제 된 witch의 개정판이 제공됩니다.

그런 다음 다른 답변과 마찬가지로 파일을 이전 개정으로 되돌릴 수 있습니다.

hg revert -r <revision number> <path to deleted file>

대신 파일 이름 패턴을 사용하여 알고있는 내용에 맞출 수 있습니다. 예를 들어 **/NAME.c모든 디렉토리에서 검색 하는 데 사용할 수 있습니다 . 파일 이름 패턴 에서 읽을 수 있습니다 . 그리고이 링크를 사용하여 새로운 revset 사양 에 대해 알 수 있습니다.


1

수락 된 답변에 추가-커밋의 모든 제거를 취소하려는 경우 더 빠릅니다. 수백 개의 파일이 들어있는 큰 폴더를 hg addremove삭제하고을 (를) 수행했습니다. 내 의도가 전혀 아니 었으므로 모든 삭제를 취소해야했습니다.

Mercurial 저장소 기록에서 삭제 된 파일 찾기를 사용하면 신속하게? + xargs + tr, 모든 개정 -3 제거를 개정 -4에서 버전으로 되돌립니다.

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

파일 이름에 공백이 있으면 실패합니다. http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html 에는 현재 {file_dels}분할 된 템플릿이없는 것 같습니다 \n.


0

을 사용하여 저장소에서 마지막 커밋을 취소 할 수 있습니다 hg rollback. 사용 가능한 롤백 수준은 하나뿐이므로 둘 이상의 커밋으로 제거를 수행 한 경우 변경 사항을 완전히 취소하지 않습니다. 이것은 로컬 저장소에서만 작동하므로 푸시 한 경우 원격 저장소에서 실행 취소 할 수 없습니다.


1
이건 작동하지 않습니다. Mercurial Distributed SCM (버전 1.4.1 + 20091201)이 설치된 Mac을 사용하고 있습니다. 저장소를 설정하고 모두 커밋하고 제거한 다음 다시 커밋했지만 R (emoved)로 표시된 파일 목록 만 가져 오지만 실제로 파일을 다시 가져 오지는 않습니다. 커밋하기 전에 파일을 R (emoved) 및 Rollback으로 표시하면 아무 일도 일어나지 않습니다.
PurplePilot 2010

hg 롤백을 완료하면 리포지토리가 롤백되지만 현재 작업 디렉토리에는 여전히 변경 사항이 있습니다. hg에게 롤백 된 개정판에 대한 깨끗한 업데이트를 수행하도록 지시하십시오. 이제 팁 : hg up -C.
ataylor

1
hg rollback파일 삭제는 커밋 트랜잭션의 일부가 아니므로 제거 된 파일을 복구하지 않습니다.
mrucci 2010

4
맞습니다. 제거하기 전에 커밋되지 않은 편집 내용을 확인하려는 경우 손실됩니다.
ataylor

0

hg stripmq (Mercurial Queues) 확장에서 제공 하는 명령을 사용하여 커밋 된 개정을 제거 할 수 있습니다 . 그러면 파일이 다시 제공됩니다.

Mercurial의 변경 집합 데이터베이스를 변경하므로 시도하기 전에 백업을 만드십시오.


0

아래 방법은 간단하고 너무 어리석어 서 잘못 될 수 없습니다. 여러 파일을 삭제하거나 이름을 바꾼 경우 괜찮습니다.

hg clone mydirectory mydirectory1

이제 mc (또는 Far Manager)를 시작하고 그것이 무엇인지 비교합니다.

완료되면 mydirectory1.


0

다음은 나를 위해 일했습니다.

hg revert -r <Revision Number> <File Name>

(선택 사항, 모든 파일을 되돌리려면)

hg revert -r <Revision Number> --all
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.