Git에서 커밋 이력 포함 완벽하게 파일 지우기

루리·2023년 8월 2일
0
post-thumbnail

계기

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를 봐도
해당 파일에 대한 기록을 찾을 수 없게 된다.

잃어버린다면 찾을 수 없으니까 관리를 잘 하는 걸로......😥😅

profile
안녕하세요

0개의 댓글