2009-06-22 1 views
46

나는 이것에 대한 답을 이미 알고 있다고 생각하지만 어쨌든 물어볼 것이라고 생각했다.Mercurial에서 하나의 파일에 대한 기록을 삭제할 수 있습니까?

중요한 정보가 담긴 Mercurial 저장소에 파일이 추가되었다. 전체 repo를 제거하지 않고 변경 기록과 함께 해당 파일을 제거 할 수있는 방법이 있습니까?

+0

"제거"가 아니지만 repo를 자체로 변환하고 모든 변경 집합 ID가 손실되는 경우에도이 대답은 저에게 도움이되었습니다. http : // stackoverflow.co.kr/a/22607889/714733 – jazzcat

답변

22

아니요, 불가능합니다. 그것에 관한 수은 빨간 책의 changes that should have never been 섹션을 읽으십시오; 특히이 단락을 포함 what about sensitive changes that escape 하위 섹션 : 그 실종을 적용 할 수있는 방법이 없기 때문에

의욕 또한, 파일을 만들거나 역사에서 사라 완전히 을 변경 집합하는 방법 을 제공하지 않습니다 ; 누군가 쉽게 의 Mercurial 사본을 으로 수정하면 그러한 지시어를 무시할 수 있습니다. 또한, 는 의욕이 같은 기능을 제공하는 경우에도, 간단하지 뽑아했다 누군가 변경 집합이, 그것에 의해 을 영향을받지 않습니다이나 웹 크롤러가 잘못된 시간에 방문 것 "이 파일이 사라지게" 디스크 백업 또는 기타 메커니즘을 사용합니다. 실제로 버전 관리 시스템을 배포하지 않으면 데이터 을 신뢰할 수 없게 만들 수 있습니다. 그러한 제어 기능을 제공하는 환상을 제공하면 쉽게 보안에 대한 잘못된 인식을 줄 수 있으며 전혀 제공하지 않는 것보다 더 나쁜 이 될 수 있습니다.

최선을 다하고 변화를 되 돌리는 일반적인 방법은 backout 명령 (다시, 수은 책 : dealing with committed changes)를 통해 수은이 지원되지만 정보 저장소에서 사라지지 않습니다 정확히 저장소를 복제 누구인지하지도 것을 위에 설명 된 것처럼 보안에 대한 잘못된 인식을 제공합니다.

+12

네, 할 수 있습니다 : https://www.jitbit.com/alexblog/232-removing-files-from-mercurial-history/ 당연히 모든 사람들이 당신의 repos를 reclone해야하지만, 느슨한 전체 역사. – wrzasa

+0

이것이 받아 들인 대답이지만 올바른 대답은 아닙니다. @ wrzasa는 그의 코멘트에서 정답을 언급했다. 개인적으로 OP가 해당 링크의 정보를 사용하여 여러 번 요청한 작업을 수행했습니다. – Chris

-2

HG 이식 후 HG는 제거

+0

파일은 거의 모든 변경 기록을 거칩니다. 위의 명령을 사용하여 다른 파일의 변경 내역을 그대로두고 repo에서 파일 기록을 제거하는 방법을 확장 할 수 있습니까? –

+1

이식을 사용하여 변경 집합에서 단일 파일을 제거 할 수 없습니다. 이식은 한 지점이나 저장소에서 다른 저장소 또는 저장소로 전체 변경 세트를 이동하는 방법 만 알고 있습니다 (hg export | hg import와 같습니다). 변환 확장에 대한 내 대답을 참조하십시오. –

58

당신이 쉽게 이렇게하면 저장소의 모든 변경 집합 ID를 중단 할 것이라는 의미에서 의욕에서 특정 파일을 제거 할 수있는 올바른 것입니다. 변경 집합 ID를 변경하면 모든 사람이 저장소를 다시 복제해야합니다. Mercurial에서 히스토리 수정의 결과에 대한 정보는 Wiki page about editing history을 참조하십시오.

괜찮 으면 (회사의 내부 리포지토리) convert extension을 살펴보십시오. hg → hg 회 전환을 수행 할 수 있으며 - 파일 맵 인수를 사용하면 개의 파일을 제외 할 수 있습니다.

+1

특정 Mercurial 버전의 문제를 처리하려면 http://stackoverflow.com/questions/10103227/how-do-you-remove-big-files-from-history-in-mercurial을 참조하십시오. –

+1

감사의 말 Martin은 컴파일 된 바이너리 객체로 가득 찬 대량 비축 저장소를 구해 줬습니다. 하루를 구했다! –

7

전역 적으로는 가능하지 않지만 파일이 추가 된 지점 이후에 각 커밋의 ID가 변경됩니다. 변경 사항을 지키려면 저장소의 모든 단일 사본에 액세스해야합니다. 특히 저장소에서 가져온 저장소 나 푸시 된 저장소는 특히 필요합니다.

그렇다면 Mercurial wiki에서 설명한 Editing History 시퀀스를 따라 제 저장소 중 하나에서 파일을 제거했습니다.

[extensions] 
mq = 
  • 상류에서 최근 변경 사항을 당겨 :

    1. 당신의 .hgrc에서 MQ 확장자를 사용 : 5200a5a10d8b 이후 버전에서 변경되지 않은 파일 path/to/badfile.cfg을 추가 :이 순서는 개정 1301 가정 . 이후 MQ에 파일 추가에서

      hg pull 
      
    2. 가져 오기 모든 :

      hg qimport -r 1301:tip 
      hg qpop -a 
      
    3. 이 커밋에서 파일을 제거는 그것을했다.

      hg qpush 1301.diff 
      hg forget path/to/badfile.cfg 
      hg qrefresh 
      
    4. 패치를 새로운 Mercurial 버전으로 변환하십시오.

      hg qpush -a 
      hg qfinish -a 
      
    5. 새 개정판을 업 스트림으로 푸시하십시오.

      hg push -f 
      
    6. 상류 저장소 및 매일 다른 사본에, 이전 버전을 제거합니다. 경고

      hg strip 5200a5a10d8b 
      

    : 당신이 조심 아니라면이 단계는 작업을 파괴 할 수있다. 업스트림에서 마지막으로 끌어온 이후 누군가가 무엇인가를 저 지르면 스트리핑하기 전에 해당 작업을 리베이스해야합니다. 안타깝게도 여기에 rebase 확장자는 유용하지 않습니다. MQ를 다시 사용하여 새 커밋을 새 팁에 적용하는 패치로 변환해야합니다.

    행운을 빈다.

  • +0

    이 작업을하기 전에 나는 '페이즈 - 시크리트 - 포스 1301'을해야만했다. –

    +0

    흥미 롭습니다. 위상이 약간 다르긴하지만 커밋에서 파일을 제거하는 대신 전체 커밋을 숨기는 것 같습니다. 또한 아마 업스트림 저장소에 대한 커밋을 제거하거나 숨기지 않을 것입니다. – eswald

    4

    10 분 이내에 완료 할 수 있습니다. 단일 저장소에서 결과가 있지만

    방법 : this excellent guide에 설명 된대로 hg convert를 사용합니다. 기본적으로 Hg repo를 새로운 Hg repo로 "변환"하지만 변환 중에 제외 할 파일 목록을 지정하게됩니다. "

    • 이 추가되었습니다 제외 할 파일 결국 변경 집합 ID를
    • 새로운을 다른 것입니다 결과에 관해서는

      Make sure all your teammates have pushed their local changes to the central repo (if any) 
      Backup your repository 
      Create a "map.txt" file: 
      
      # this filemap is used to exclude specific files 
      exclude "subdir/filename1.ext" 
      exclude "subdir/filename2.ext" 
      exclude "subdir2" 
      
      Run this command: 
      hg convert --filemap map.txt c:/oldrepo c:/newrepo 
      NOTE: You have to use "forward-slash" in paths, even on windows. 
      Wait and be patient 
      Now you have a new repo at c:\newrepo but without the files 
      

      ... :이 키 단계의 발췌 한 것입니다 깨끗한 "메인 저장소를 기존의 장소에 수동으로 넣어야합니다.

    • 모든 팀 구성원은 기본 저장소의 새 복제본을 만들어야합니다.
    • Hg와 통합되는 다른 서비스는 주의를 요한다. 문제 추적기, 코드 검토 시스템 등)