-
(Git) 이전 Commit에서 특정 file만 삭제하기 (filter-repo)IT 지식 창고 2024. 3. 22. 19:26
FILE_NAME에 git repository를 root로 생각하고 경로를 포함하여 file 명을 넣습니다.
git filter-repo --invert-paths --path FILE_NAME
본문
간혹 대용량 파일 및 개인정보를 commit하고 master에 까지 올리는 아주 큰 불상사(회사에서 그러면 안됩니다.)가 발생하였을 때, filter-repo 또는 BFG를 활용하여 삭제할 수 있다고 합니다. (문제의 commit 전까지 돌아간 다음에 그 이후의 수정 내역을 직접 반영해도 되지만 협업중에는 상당히 번거롭죠.)
완벽히 테스트 해보진 못했지만, 두 과정의 삽질한 내용을 작성해두겠습니다.
git filter-repo
23년 blog를 참고해서 하다가, 그 새 조금 바뀐 것같아서 공식홈페이지 보고 따라했습니다.
git filter-repo와 같은 경우, 사용에 있어서 조심하라고 하니 웬만하면, repository 복사 또는 새로운 git clone 등 후에 테스트하고 실제 적용합시다.
직접 push하기 전까지는 remote에 안올라가니까 local에서 테스트 합시다. (file 삭제 후, 파일을 삭제하고자 한 commit으로 checkout해서 확인하면 file이 삭제된 것으로 확인할 수 있습니다.)
설치 방법
git에서 제공하는 cammand는 아니고, extension처럼 추가로 설치해야하는 것 같습니다.
설치 시, Python이 필요로 합니다. (window를 사용하므로, pip install을 하기 위해..)
pip install git-filter-repo
공식 홈페이지에서는 scoop을 사용해서 window에서 설치하라고 하나, 뭐가 꼬이고 잘 안되어서 chatgpt한테 물어보니 pip으로 설치하라네요. (python3 git-filter-repo --analyze도 간단하게 된다는 데 전 간단하게 안되었습니다.. 여기에 그렇게 시간 투자하는 것도 아닌 것 같아서..)
사용 방법
- 적용하기 위한 local git repostory(.git이 있는 directory)로 갑니다. (웬만하면 clone 후 적용하세요.)
- 이후 아래의 커맨드 (본문 제일 위에 있는 커맨드를 사용합니다.)
- FILE_NAME에 git repository를 root로 생각하고 경로를 포함하여 file 명을 넣습니다.
git filter-repo --invert-paths --path FILE_NAME
ex) my-repo라는 directory 내에 test/models.hdf5를 삭제하고 싶을 경우 (정규표현식 안먹는 듯 합니다.)
git filter-repo --invert-paths --path test/models.hdf5
- 실행 후 자동으로 remote를 제거하니, 다시 remote link를 추가합니다.
git remote add origin https://github.com/OWNER/REPOSITORY.git
- push를 강제로 해야하며, --all을 통해 모든 branch를 강제로 합니다. (모든 branch에 해당 file을 삭제하려 하기 때문)
git push origin --force --all > Counting objects: 1074, done. > Delta compression using 2 threads. > Compressing objects: 100% (677/677), done. > Writing objects: 100% (1058/1058), 148.85 KiB, done. > Total 1058 (delta 590), reused 602 (delta 378) > To https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git > + 48dc599...051452f main -> main (forced update)
- 이후, file 삭제 전 branch라면 rebase를 통해 pull 받으면 됩니다.
- 단, local에 이미 받은 경우는 삭제 후 다시 git clone해야 합니다. ( .git에 cache로 저장되어 있는 느낌인데, gc관련해서 커맨드도 적용이 안되는 듯함..)
BFG
BFG가 잘되어있고 추천한다고 하여 먼저 시도를 했지만, 결론적으로 저는 실패했습니다.
실패 이유
- 삭제를 하고자 하는 repository에 MR이나 PR이 존재한다면, 적절한 권한이 없으면 변경 못하게 막아버립니다. (아래와 같은 에러를 보고 유추...)
- 회사에서 협업 중에 발생한 일이라, 권한 요청하는 것도 번거롭고... git filter-repo라는 길이 있으니 여기서 그만두었습니다.
그래도, BFG로 약간 시도했으니 얻은 정보들 공유합니다.
- java가 선행으로 설치되어야 합니다. (8버전 이상)
- java를 bfg.jar 파일을 실행시켜 사용합니다.
- BFG 참고 공식 link : https://rtyley.github.io/bfg-repo-cleaner/
- BFG는 정규표현식 가능합니다. (ex, *.hdf5 등)
- git filter-repo에 비해 print log가 조금 더 친절함(?)
'IT 지식 창고' 카테고리의 다른 글
(Hibernate) SQLite Dialect Error (0) 2024.08.24 (torchio) 3D Data Augmentation 중 주로 사용하는 기법 (0) 2024.05.14 (Python) os.path vs pathlib.Path (1) 2024.02.26 (Python) 간단한 커스텀 프로그레스 바 코드 (0) 2024.02.21 (Pytorch) Pytorch에서 학습 및 테스트 시 GPU VRAM이 계속 증가하는 이유 (2) 2024.02.14 댓글