본문 바로가기
개발도구/Git

git filter-branch

by 횰쓰 2022. 10. 23.

최근에 다른 기업의 지인 개발자들을 만나서 개발 이야기를 하다가 그 기업의 팀장님은 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하면 원격저장소에 올라간 파일을 업앨 수 있다. 

 

 

강제 (force) push 수행하기

git push force 란? 위와 같이 가끔씩 사용자의 로컬저장소의 변경사항들이 원격저장소의 변경사항들과 호환되지 않는 경우 사용자의 변경사항을 push 하는 유일한 방법은 git push force 를 이용하는 것

hyolls100.tistory.com

 

이렇듯 원격저장소에 파일을 실수로 올렸다할지라도 해당 filter를 통하여 index부분을 수정함으로써 그렇게 수정된 내용을 원격저장소에 투입을 할 수 있다는 것이다. 

 

 

 

 

 

 

영상은 여기에 공유하겠다. 

 

댓글