测验:从历史中剔除
한국어 원문으로 표시합니다.
git rm conf/prod.env 를 하고 커밋했다. 이력 속 토큰은 어떻게 되는가?
- 그 파일을 담고 있던 blob 이 곧바로 저장소에서 삭제된다
- 다음
git gc가 자동으로 그 blob 을 지운다 - 옛 커밋이 그 blob 을 가리키고 있어
git cat-file로 원문이 그대로 나온다 - 원격에 push 할 때 git 이 삭제된 파일의 객체를 제외하고 보낸다
git filter-branch 를 브랜치 하나만 지정해 돌리면 무엇이 문제인가?
- 다른 브랜치와 태그가 옛 커밋을 붙잡은 채 남는다
- 재작성된 커밋의 작성자 정보가 모두 초기화된다
- 인덱스 필터가 작업 트리를 펼쳐 매우 느려진다
.gitignore가 무시되어 삭제 대상이 다시 추가된다
재작성이 끝났는데 git rev-list --objects --all 에 그 파일이 여전히 나온다. 첫 번째 원인은?
- 작업 트리에 그 파일이 아직 남아 있어서
--prune-empty를 빠뜨려 빈 커밋이 남아서- 인덱스가 갱신되지 않아 캐시된 목록이 나오는 것이어서
refs/original/아래에 원래 ref 가 백업으로 남아 있어서
git gc 에 --prune=now 를 붙이는 이유는?
- 기본값은 유예 기간이 지난 도달 불가 객체만 지우기 때문
- 붙이지 않으면 packfile 을 새로 만들지 않기 때문
- 붙이지 않으면 reflog 가 함께 지워지지 않기 때문
- 붙이지 않으면 원격에서도 지워지지 않기 때문
비밀이 이력에 들어간 것을 발견했다. 가장 먼저 할 일은?
- 그 파일을
.gitignore에 넣고 팀에 공지한다 - 그 자격 증명을 폐기하고 새로 발급한다
git filter-branch로 이력을 재작성한다- 원격 저장소를 비공개로 바꾸고 접근 로그를 확인한다
이력 재작성 뒤 팀에 무엇을 안내해야 하는가?
- 각자
git pull --rebase로 새 이력을 받으라고 안내한다 - 로컬 브랜치를
git merge origin/main으로 합치라고 안내한다 - 아무것도 하지 않아도 다음 fetch 때 자동으로 정리된다고 안내한다
- 각자 새로 clone 하라고 안내한다