Spring Boot 프로젝트 구축 중에
GitHub에 업로드를 했다.
그런데 IntelliJ에서 properties 파일이 자동으로 ignore에 추가되지 않았다.
properties 파일은 중요한 DB 정보(ID/PW)가 담겼으므로 보안을 위해 repository에서는 지워주기로 한다.
(1) 일단은 gitignore에 파일을 올려준다.
// .gitignore
### env file ###
application.properties
### log file ###
/logs/
파일은 위와 같은 방법으로 하고,
폴더는 아래와 같이 맨 마지막에 폴더임을 나타내는 /를 추가한다.
(2) 캐시를 지워주고,
// 전체 다 한번 밀어줄 경우
git rm --cached .
// 각각 선택해서 삭제해줄 경우
git rm --cached 삭제할 파일 또는 폴더
git rm --cached src/main/resources/application.properties
(3) 해당 파일이 포함된 커밋 이력을 모두 지워준다.
GitHub에 이미 올린 파일 history에서 삭제하기
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 삭제할 파일 또는 폴더' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch src/main/resources/application.properties' --prune-empty --tag-name-filter cat -- --all
나는 지우기 전에 커밋을 많이 해서 좀 오래 걸렸다.
저렇게 커밋마다 하나씩 잘 지워준다.
마무리로 이런게 뜨면 잘 지워진 것
아주 긴 명령어를 이렇게만 보면 이해가 안 가기 때문에 하나하나 뜯어보는 과정이 필요하다.
바쁘다 바빠 현대 사회이기 때문에 챗 지피티에게 물어보았다.
chat gpt
git filter-branch: Git 저장소의 커밋 이력을 재작성하는 명령어입니다.
--force: 이미 존재하는 브랜치에 강제로 커밋 이력을 덮어쓸 수 있도록 합니다. 주의해서 사용해야 합니다.
--index-filter: 각 커밋의 인덱스(스냅샷)를 조작하기 위한 명령어입니다. 이 경우 git rm --cached --ignore-unmatch src/main/resources/application.properties를 사용하여 해당 파일을 모든 커밋에서 삭제합니다.
--prune-empty: 빈 커밋을 삭제합니다. 특정 파일을 모든 커밋에서 삭제했기 때문에 이 파일이 존재하지 않는 빈 커밋들을 제거하는 옵션입니다.
--tag-name-filter cat: 모든 태그들을 재작성 없이 그대로 유지합니다. 즉, 태그들은 영향을 받지 않습니다.
-- --all: 모든 브랜치에 대해 작업을 수행합니다.'
이 명령어를 실행하면 src/main/resources/application.properties 파일이 모든 커밋에서 삭제되고, 변경사항이 적용된 새로운 커밋 이력이 생성됩니다. 하지만 이러한 작업은 Git 저장소의 이력을 완전히 바꾸는 작업이므로 주의해서 사용해야 합니다.
(4) 마지막으로 변경사항을 repository에 push한다.
git add .
git commit -m "[REMOVE] 커밋 메시지 아무거나"
git push --f origin main
이때는 --f 또는 --force 명령어를 사용해야 한다.
안 하면 pull 먼저 하라고 이런거 뜸
이러면 GitHub 또는 GitLab Repository의 history를 봐도
해당 파일에 대한 기록을 찾을 수 없게 된다.
잃어버린다면 찾을 수 없으니까 관리를 잘 하는 걸로......😥😅