문제

나는 이미 이것에 대한 답을 알고 있다고 생각하지만 어쨌든 물어볼 것이라고 생각했다.

우리는 민감한 정보가있는 Mercurial Repository에 추가 된 파일이 있습니다. 전체 repo를 제거하지 않고 해당 파일을 변경하는 방법이 있습니까?

도움이 되었습니까?

해결책

아니, 당신은 할 수 없습니다. 읽기 결코 없었던 변화 그것에 관한 수은 빨간 책의 섹션; 그리고 특히 탈출하는 민감한 변화는 어떻습니까? 이 단락을 포함하는 하위 섹션 :

Mercurial은 또한 파일 또는 Changes 세트를 역사에서 완전히 사라지는 방법을 제공하지 않습니다. 왜냐하면 실종을 시행 할 방법이 없기 때문입니다. 누군가가 그러한 지시를 무시하기 위해 Mercurial 사본을 쉽게 수정할 수있었습니다. 또한 Mercurial이 그러한 기능을 제공하더라도 단순히 "이 파일을 사라지게 만들지 않은"사람은 변경 사항에 영향을받지 않으며, 잘못된 시간, 디스크 백업 또는 기타 메커니즘에 웹 크롤러가 방문하지 않을 것입니다. . 실제로, 분산 된 개정 제어 시스템은 데이터를 안정적으로 사라질 수 없습니다. 그러한 통제의 환상을 제공하면 쉽게 잘못된 보안 감각을 줄 수 있으며 전혀 제공하지 않는 것보다 더 나빠질 수 있습니다.

커밋 된 변화를 되돌리는 일반적인 방법은 backout 명령 (다시, Mercurial Book : 헌신적 인 변화를 다루는 것) 그러나 정보는 저장소에서 사라지지 않습니다. 저장소를 정확히 복제 한 사람을 알지 못하기 때문에 위에서 설명한대로 잘못된 보안 감각을 줄 것입니다.

다른 팁

이렇게하면 저장소의 모든 Changeet ID를 방해한다는 점에서 Mercurial에서 특정 파일을 쉽게 제거 할 수없는 것이 맞습니다. Changeet ID를 변경하면 모든 사람이 저장소를 다시 클릭해야합니다. 참조 히스토리 편집에 대한 위키 페이지 수은의 역사를 수정 한 결과에 대한 정보.

그것이 당신에게 괜찮다면 (회사의 내부 저장소) 확장을 변환합니다. 할 수 있습니다 HG → HG 변환 및 a -filemap 익숙해 질 수있는 인수 들어오지 못하게 하다 무엇보다도 파일.

로컬로 가능하지만 전 세계적으로는 가능하지 않으며 파일이 추가 된 지점 후 각 커밋의 ID를 변경합니다. 변경하려면 리포지토리의 모든 단일 사본, 특히 당기거나 밀어 붙이는 저장소에 액세스해야합니다.

즉, 나는 다음을 따랐다 편집 기록 내 리포지토리 중 하나에서 파일을 제거하기 위해 Mercurial Wiki에 설명 된 시퀀스. 이 시퀀스는 개정기 1301 : 5200A5A10D8B가 파일을 추가했다고 가정합니다. path/to/badfile.cfg, 후속 개정에서 변경되지 않았습니다.

  1. 당신의 MQ 확장을 활성화하십시오 .hgrc:

    [extensions]
    mq =
    
  2. 상류에서 최근 변경 사항을 가져옵니다.

    hg pull
    
  3. 파일 추가에서 MQ로 모든 것을 가져옵니다.

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. 추가 한 커밋에서 파일을 제거하십시오.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. 패치를 새로운 수은 수정으로 변환하십시오.

    hg qpush -a
    hg qfinish -a
    
  6. 새로운 개정판을 상류로 밀어 넣으십시오.

    hg push -f
    
  7. 상류 저장소에서 그리고 다른 모든 사본은 이전 개정판을 제거하십시오.

    hg strip 5200a5a10d8b
    

경고:이 단계는 조심하지 않는 한 작업을 파괴 할 수 있습니다. 마지막으로 업스트림에서 당기는 이래로 아무도 커밋 한 사람이라면 스트리핑하기 전에 그 일을 다시해야합니다. 불행히도, rebase 확장은 여기서 도움이되지 않습니다. MQ를 다시 사용하여 새 커밋을 새 팁에 적용하는 패치로 변환해야합니다.

행운을 빕니다.

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

방법 : 설명대로 HG 변환을 사용하십시오 이 훌륭한 가이드. 기본적으로 HG Repo를 새로운 HG Repo로 "변환"하지만 변환 중에 제외 할 파일 목록을 지정하게됩니다. 이것은 주요 단계의 발췌입니다.

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

결과는 ...

  • 제외하려는 파일 후에 모든 Changeet ID가 다릅니다.
  • 새로운 "깨끗한"메인 저장소는 기존의 대신 수동으로 배치해야합니다.
  • 모든 팀원은 메인 리포의 새로운 클론을 만들어야합니다.
  • HG와 통합되는 다른 서비스는주의가 필요할 수 있습니다 (예 : 문제 추적기, 코드 검토 시스템 등).

HG 이식, HG 스트립

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