나는 실수로 일부 민감한 정보를 공용 git repo에 위탁했습니다 (예!). 특정 기간 동안 모든 기록을 영구히 삭제할 수있는 방법이 있습니까? 방금 전 레포를 지우고 신선하게 시작해야합니까?
답변
이것을하는 표준 방법은이다 git-filter-branch
. 이를 통해 커밋 기록을 살펴보고 각 커밋을 다시 작성할 수 있습니다. 당신의 경우에, 당신이 실수로 passwords.txt
당신의 역사에서 그것을 제거하고 제거해야 한다고 가정 해 봅시다 .
실행할 명령은 다음과 같습니다.
git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD
한 장 한 장 :
-
git filter-branch
: 다시 쓰기 기록. -
--index-filter
: 각 커밋에 대해 인덱스를 변경 한 다음 다시 커밋하고 싶습니다. -
'git rm --cached --ignore-unmatch passwords.txt'
각 커밋에 대해이git-rm
명령 을 실행하여 인덱스를 변경하십시오 . 이렇게하면passwords.txt
인덱스에서 명명 된 모든 파일이 제거됩니다 . -
HEAD
: 현재 체크 아웃 된 브랜치의 히스토리를 다시 작성하십시오.
끝나면 부족한 부분을 제외하고는 새로운 커밋을 동일한 기록으로 체크 아웃합니다 passwords.txt
. 히스토리를 다시 작성 했으므로 리포지토리를 공유하는 모든 사용자에게 업스트림 리베이스에서 복구 해야한다고 경고해야합니다 .
예를 들어, 당신의 역사가 이와 같이 보이고 BC가 커밋 되었다면 :
A ---- B ---- C ---- D ---- E
작업이 완료되면 내역이 다음과 같이 보입니다.
A
\
B' ---- C' ---- D' ---- E'
D와 E가 D ‘와 E’에 다시 쓰여졌 음을 주목하라. 그들은 같은 트리를 가리킬 수도 있지만 역사가 바뀌었기 때문에 새로운 커밋 ID를 가지며 힘내에 관한 한 새로운 커밋으로 간주됩니다.
사용법에 대한 더 자세한 정보 는 Pro Git bookgit-filter-branch
의 “Rewriting History”섹션 에서 찾을 수 있습니다.