Git 실전 · 토큰이 이력에 들어갔다 · 실습
토큰이 이력에 들어갔다 — 지웠는데도 나온다
목표
이력에서 비밀 파일과 큰 파일을 실제로 들어냅니다. 그리고 들어낸 뒤에도 남는 것이
무엇인지까지 확인합니다.
왜 중요한가
git 은 내용 주소 저장소입니다. 파일 하나하나가 blob 객체가 되고, 그 blob 을 가리키는
트리와 커밋이 남아 있는 한 객체는 살아 있습니다. 그래서 git rm 은 "앞으로 없다" 는
뜻일 뿐 "없었던 일" 이 아닙니다. 비밀이 들어갔을 때 이 차이를 모르면, 지우고 커밋한
뒤 안심한 채로 토큰을 계속 쓰게 됩니다. 이 실습은 그 차이를 명령 출력으로 보여 주고,
실제로 없애는 순서(재작성 → 백업 참조 제거 → reflog 만료 → gc)를 손에 익힙니다.
마지막 단계가 결론입니다 — 이미 퍼진 사본에는 그대로 남으므로, 비밀은 청소가 아니라
폐기가 먼저입니다.
단계
1. /root/gitx6/repo 에 토큰 파일과 900KB 덩어리가 섞인 이력을 만들고, 워킹 트리에서
지우는 커밋까지 넣습니다.
2. 동료 사본 /root/gitx6/peer 를 떠 두고, 지금 상태를 notes/before.txt 에 남깁니다.
3. git filter-branch 로 모든 ref 를 재작성합니다.
4. 아직 객체가 남아 있는 이유를 notes/original.txt 에 적고 그 참조를 걷어냅니다.
5. reflog 를 만료하고 gc --prune=now 로 실제로 지운 뒤 크기를 notes/after.txt 에
남깁니다.
6. 해시가 전부 바뀐 사실을 notes/rewrite.txt 에 남깁니다.
7. /root/gitx6/peer 를 새 이력으로 따라가게 하고, 그 사본에 비밀이 남아 있는지를notes/collab.txt 에 적습니다.
8. notes/report.md 에 사고 대응 순서를 정리합니다.
참고
conf/prod.env는 아래 두 줄로 만듭니다. 전부 합성한 가짜 값이고, 뒤 단계가 이 내용의- 커밋 시각은
GIT_AUTHOR_DATE와GIT_COMMITTER_DATE로 고정하세요. git filter-branch는 경고를 띄우고 10초를 기다립니다.- 흔한 실수: 3단계까지만 하고 끝났다고 보는 것입니다.
refs/original/이 남아 있는 - 흔한 실수: 7단계에서
peer를 지우고 다시 clone 하는 것입니다. 이 실습은 이미 퍼진
blob 이 사라졌는지를 확인하므로 한 글자도 바꾸지 마세요.LABHUB_FAKE_TOKEN=deadbeefdeadbeefdeadbeefdeadbeef 와DB_PASSWORD=not-a-real-password-1234 입니다.
FILTER_BRANCH_SQUELCH_WARNING=1 을 앞에 붙이면 넘어갑니다.
한 객체는 하나도 사라지지 않습니다.
사본에 무엇이 남는지를 보는 것이라, 있던 사본을 그대로 따라가게 해야 합니다.
단계 8개
- 토큰과 큰 덩어리가 섞인 이력 만들기
- 지웠는데도 원문이 나온다
- 모든 ref 를 재작성한다
- 아직 하나도 안 사라졌다
- reflog 를 비우고 실제로 지운다
- 해시가 전부 바뀌었다
- 이미 떠 간 사본에는 그대로 있다
- 사고 대응 순서로 정리하기