최근에 다른 기업의 지인 개발자들을 만나서 개발 이야기를 하다가 그 기업의 팀장님은 git 마법사라며 filter-branch 같이 들어보지도 못한 git 기능들을 많이 알고 계신다면서 이야기를 듣게 되었다.
filter-branch가 과연 뭘까 귀 기울여듣게 되면서 따로 집에 와서 찾아보게 되었다. 참고할만한 블로그도 몇 없어서 유투브 영상을 통해서 공부해보았다. 이를 공유하고자 글을 작성한다.
filter-branch가 필요한 상황 2가지
1. 민감한 파일이 실수로 원격 저장소에 push 되었을 때
- 원격 저장소에 실수로 올린 파일을 지우고 다시 push를 하여도, 이전에 파일이 올라왔던 기록을 통하여 파일 확인이 가능해지므로 무용지물이 되어버리는데 이런 상황을 간단히 해결하고 싶을 때 사용함.
2. 프로젝트를 분리하고 싶을 때
- 진행하고 있던 프로젝트의 규모가 커지게 되면서 2개로 프로젝트를 분리하고 싶을 때 사용함.
* 참고사항
git add -> git commit -> git push 명령어로 통하여 원격 저장소에 commit내역을 기록할 수 있는데
이때 작업하고 있는 내용들은 Work Tree라는 구조를 통해서 관리하고 되고 그 중에서 최종적으로 commit 하고자 하는 내용들을 add하게 되면 add 라는 명령어를 통하여 Index라는 것으로서 대상들이 관리되게 된다.
참고로 add를 마친 파일이나 내용들은 stage 상태가 되었다고 말한다.
stage상태가 된 내용들을 commit하게 되면 원격저장소가 아닌 로컬저장소에서 까지 관리가 되고 push 하게되면 원격저장소로 commit내역이 적재가 되는 것이다.
위 2가지 상황 중 첫번째 상황을 예로 들어 설명하겠다.
push되면 안되는 파일을 add하여 commit후 push까지 마쳐 원격저장소에까지 파일이 적재되어 해당 파일을 없애고 싶을 때 filter-branch로 특정 commit 기록을 찝어서 덮어쓰기하여 있었던 일도 없었던 일로 기록할 수 있어 파일을 없앨 수 있다.
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 파일명' --prune-empty HEAD
--force
: 따지지 말고 시키는 대로 하라
--index-filter
: filter-branch를 어떤 filter를 적용하냐에 대한 옵션으로 index에 있는 것들을 지우라는 것임
' '
: 어떻게 filtering을 할지에 대한 정보
--ignore-unmatch
: 파일명과 매치되지 않는 commit내역들은 무시하고 filtering하라는 git rm 옵션임
--prune-empty
: index에서 파일명과 매칭되는 것들을 지우다 보면, 빈껍데기 commit들이 생길 수 있는데 그러한 commit들을 없애라는 옵션임.
작은따음표 부분을 통해서 실제 filtering 작업이 수행되는데 그 filter가 index 부분에 적용된다는 것이다. index-filter 라는 것은 로컬저장소 안에서 filter를 index부분에 변화를 가하는 것이다.
filter가 적용되었다면 로컬저장소에 있는 index에 변화가 생긴 상태이다. 따라서 이를 push 하여야 원격 저장소의 적재된 내역도 변화될 것이므로 git push --force 명령어를 이용하여 push하면 원격저장소에 올라간 파일을 업앨 수 있다.
이렇듯 원격저장소에 파일을 실수로 올렸다할지라도 해당 filter를 통하여 index부분을 수정함으로써 그렇게 수정된 내용을 원격저장소에 투입을 할 수 있다는 것이다.
영상은 여기에 공유하겠다.
'개발도구 > Git' 카테고리의 다른 글
git cherry-pick (원하는 commit 가져오기) (0) | 2022.07.31 |
---|---|
git remote branch 가져오기 (0) | 2022.07.31 |
git remote add (원격저장소 추가) (0) | 2022.07.31 |
git branch -d (브랜치 삭제하기) (0) | 2022.07.03 |
강제 (force) push 수행하기 (0) | 2022.07.03 |
댓글