나는 이것에 대한 답을 이미 알고 있다고 생각하지만 어쨌든 물어볼 것이라고 생각했다.Mercurial에서 하나의 파일에 대한 기록을 삭제할 수 있습니까?
중요한 정보가 담긴 Mercurial 저장소에 파일이 추가되었다. 전체 repo를 제거하지 않고 변경 기록과 함께 해당 파일을 제거 할 수있는 방법이 있습니까?
나는 이것에 대한 답을 이미 알고 있다고 생각하지만 어쨌든 물어볼 것이라고 생각했다.Mercurial에서 하나의 파일에 대한 기록을 삭제할 수 있습니까?
중요한 정보가 담긴 Mercurial 저장소에 파일이 추가되었다. 전체 repo를 제거하지 않고 변경 기록과 함께 해당 파일을 제거 할 수있는 방법이 있습니까?
아니요, 불가능합니다. 그것에 관한 수은 빨간 책의 changes that should have never been 섹션을 읽으십시오; 특히이 단락을 포함 what about sensitive changes that escape 하위 섹션 : 그 실종을 적용 할 수있는 방법이 없기 때문에
의욕 또한, 파일을 만들거나 역사에서 사라 완전히 을 변경 집합하는 방법 을 제공하지 않습니다 ; 누군가 쉽게 의 Mercurial 사본을 으로 수정하면 그러한 지시어를 무시할 수 있습니다. 또한, 는 의욕이 같은 기능을 제공하는 경우에도, 간단하지 뽑아했다 누군가 변경 집합이, 그것에 의해 을 영향을받지 않습니다이나 웹 크롤러가 잘못된 시간에 방문 것 "이 파일이 사라지게" 디스크 백업 또는 기타 메커니즘을 사용합니다. 실제로 버전 관리 시스템을 배포하지 않으면 데이터 을 신뢰할 수 없게 만들 수 있습니다. 그러한 제어 기능을 제공하는 환상을 제공하면 쉽게 보안에 대한 잘못된 인식을 줄 수 있으며 전혀 제공하지 않는 것보다 더 나쁜 이 될 수 있습니다.
최선을 다하고 변화를 되 돌리는 일반적인 방법은 backout
명령 (다시, 수은 책 : dealing with committed changes)를 통해 수은이 지원되지만 정보 저장소에서 사라지지 않습니다 정확히 저장소를 복제 누구인지하지도 것을 위에 설명 된 것처럼 보안에 대한 잘못된 인식을 제공합니다.
HG 이식 후 HG는 제거
파일은 거의 모든 변경 기록을 거칩니다. 위의 명령을 사용하여 다른 파일의 변경 내역을 그대로두고 repo에서 파일 기록을 제거하는 방법을 확장 할 수 있습니까? –
이식을 사용하여 변경 집합에서 단일 파일을 제거 할 수 없습니다. 이식은 한 지점이나 저장소에서 다른 저장소 또는 저장소로 전체 변경 세트를 이동하는 방법 만 알고 있습니다 (hg export | hg import와 같습니다). 변환 확장에 대한 내 대답을 참조하십시오. –
당신이 쉽게 이렇게하면 저장소의 모든 변경 집합 ID를 중단 할 것이라는 의미에서 의욕에서 특정 파일을 제거 할 수있는 올바른 것입니다. 변경 집합 ID를 변경하면 모든 사람이 저장소를 다시 복제해야합니다. Mercurial에서 히스토리 수정의 결과에 대한 정보는 Wiki page about editing history을 참조하십시오.
괜찮 으면 (회사의 내부 리포지토리) convert extension을 살펴보십시오. hg → hg 회 전환을 수행 할 수 있으며 - 파일 맵 인수를 사용하면 에 개의 파일을 제외 할 수 있습니다.
특정 Mercurial 버전의 문제를 처리하려면 http://stackoverflow.com/questions/10103227/how-do-you-remove-big-files-from-history-in-mercurial을 참조하십시오. –
감사의 말 Martin은 컴파일 된 바이너리 객체로 가득 찬 대량 비축 저장소를 구해 줬습니다. 하루를 구했다! –
전역 적으로는 가능하지 않지만 파일이 추가 된 지점 이후에 각 커밋의 ID가 변경됩니다. 변경 사항을 지키려면 저장소의 모든 단일 사본에 액세스해야합니다. 특히 저장소에서 가져온 저장소 나 푸시 된 저장소는 특히 필요합니다.
그렇다면 Mercurial wiki에서 설명한 Editing History 시퀀스를 따라 제 저장소 중 하나에서 파일을 제거했습니다.
[extensions]
mq =
상류에서 최근 변경 사항을 당겨 :
당신의 .hgrc
에서 MQ 확장자를 사용 : 5200a5a10d8b 이후 버전에서 변경되지 않은 파일 path/to/badfile.cfg
을 추가 :이 순서는 개정 1301 가정 . 이후 MQ에 파일 추가에서
hg pull
가져 오기 모든 :
hg qimport -r 1301:tip
hg qpop -a
hg qpush 1301.diff
hg forget path/to/badfile.cfg
hg qrefresh
패치를 새로운 Mercurial 버전으로 변환하십시오.
hg qpush -a
hg qfinish -a
새 개정판을 업 스트림으로 푸시하십시오.
hg push -f
상류 저장소 및 매일 다른 사본에, 이전 버전을 제거합니다. 경고
hg strip 5200a5a10d8b
: 당신이 조심 아니라면이 단계는 작업을 파괴 할 수있다. 업스트림에서 마지막으로 끌어온 이후 누군가가 무엇인가를 저 지르면 스트리핑하기 전에 해당 작업을 리베이스해야합니다. 안타깝게도 여기에 rebase
확장자는 유용하지 않습니다. MQ를 다시 사용하여 새 커밋을 새 팁에 적용하는 패치로 변환해야합니다.
행운을 빈다.
이 작업을하기 전에 나는 '페이즈 - 시크리트 - 포스 1301'을해야만했다. –
흥미 롭습니다. 위상이 약간 다르긴하지만 커밋에서 파일을 제거하는 대신 전체 커밋을 숨기는 것 같습니다. 또한 아마 업스트림 저장소에 대한 커밋을 제거하거나 숨기지 않을 것입니다. – eswald
10 분 이내에 완료 할 수 있습니다. 단일 저장소에서 결과가 있지만
방법 : this excellent guide에 설명 된대로 hg convert를 사용합니다. 기본적으로 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
... :이 키 단계의 발췌 한 것입니다 깨끗한 "메인 저장소를 기존의 장소에 수동으로 넣어야합니다.
"제거"가 아니지만 repo를 자체로 변환하고 모든 변경 집합 ID가 손실되는 경우에도이 대답은 저에게 도움이되었습니다. http : // stackoverflow.co.kr/a/22607889/714733 – jazzcat