본문 바로가기
프로그래밍/기타

Github에 실수로 이미 올린 파일 삭제(history 삭제)

by Devry 2023. 11. 11.

깃허브로 프로젝트를 진행하다 보면 꼭 한 번쯤은 파일을 잘못 올리게 됩니다.

팀프로젝트 때 팀원 한분이. env를 올린 적도 있었고, 배포 파일, log파일, 빌드파일 등등 같이 올려놓고 몰랐던 적도 있었죠..

git reset, revert 같이 커밋이 하나인 경우가 아닌, 이력에 쌓여있을 경우 해결책으로 repository를 다시 만들 수 없을 때 최후의 수단입니다

1. .gitignore 생성

루트 폴더에 .gitignore 파일을 만든 후, git이 추적에서 제외할 폴더나 파일을 입력합니다

직접 작성한 소스 파일, package.json 등 프로젝트를 나타내는 파일을 제외하고 모든 파일을 적으면 됩니다.

구글에 .gitignore + [사용 스택]으로 검색하면 template도 많습니다.

2. 로컬 저장소 해제하기

git rm -r --cached [파일 경로]

명령어를 통해 로컬 저장소에서 캐시 삭제를 합니다 (vscode의 경우 파일에 빨간색 줄이 생김)

그 후 원격 저장소로 푸시까지 진행합니다.

git add
git commit -m “커밋 메시지”
git push origin main

3.History에서 삭제

깃허브에 들어가면 삭제된 것을 볼 수 있지만 commit 이력에서 볼 수 있는 과거 코드에는 여전히 남아있습니다.

다음 명령어를 실행하면 커밋 로컬의 history를 돌면서 해당 파일의 이력을 제거할 수 있습니다 (파일 경로 부분 바꾸기)

git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch [파일 경로]' --prune-empty --tag-name-filter cat -- --all

 

ChatGPT의 답변

더보기

filter-branch: commit 히스토리를 변경하고 재작성하는 데 사용되는 강력한 도구 (공식 문서에서도 수많은 함정 떄문에 추천하지 않는다고 한다)

 

 --force: 이 옵션은 기존의 refs/original/ 브랜치를 덮어쓰기 위해 필요합니다. 기존에 refs/original/ 브랜치가 있는 경우 이 옵션이 필요합니다.
--index-filter: 이 옵션은 인덱스를 변경하기 위한 필터를 지정합니다. 여기서는 git rm --cached -r --ignore-unmatch [파일 경로] 명령어를 사용하여 지정된 파일 또는 폴더를 인덱스에서 제거합니다. --cached 옵션은 작업 디렉토리의 파일을 실제로 삭제하지 않고 인덱스에서만 제거한다는 의미입니다.
--prune-empty: 이 옵션은 작업 후에 비어있는 커밋들을 삭제합니다. 즉, 특정 파일 또는 폴더를 제거한 결과로 생성된 빈 커밋들을 제거합니다.

--tag-name-filter cat: 이 옵션은 태그의 이름을 변경하는 필터를 지정합니다. 여기서는 태그 이름을 변경하지 않고 그대로 유지하기 위해 cat 명령어를 사용합니다.

-- --all: --는 옵션의 끝을 나타내며, 여기서는 모든 브랜치와 태그에 대해 명령을 실행하라는 의미입니다.

 

종합하면, 위 명령어는 특정 파일 또는 폴더를 포함한 모든 브랜치와 태그의 히스토리를 재작성하여 지정된 파일 또는 폴더를 삭제하고, 그로 인해 생성된 빈 커밋을 제거합니다. 주의해야 할 점은 이러한 히스토리 재작성이 이미 공유된 저장소에 영향을 미칠 수 있으므로 조심해서 사용해야 합니다.

다음 명령어를 실행하면 github의 history에서도 삭제된 것을 볼 수 있습니다.

git push origin --force --all

느낀 점

60개의 커밋이 있었는데, 중간 커밋부터 log파일이 함께 커밋된 것을 발견했다. 현재 커밋 전에 사라졌기 때문에 몰랐다. (대충 40~50 커밋에만 남아있는 느낌)

결국 git checkout으로 과거 커밋으로 간 후, *.log 파일에도 똑같이 작업해 줘서 끝이 났다.

작은 프로젝트에도 이 정도인데 규모 커질수록, history를 관리하는 게 복잡도가 배로 증가할 것이다

참고

Removing sensitive information from git history

GitHub에 이미 올린 파일 history에서 삭제하기

https://git-scm.com/

 

'프로그래밍 > 기타' 카테고리의 다른 글

마크다운 문법 정리  (0) 2023.08.29

댓글