git filter-branch란?
브랜치를 재작성할 수 있는 기능이며 간략하게 소개하자면 필터를 제공해서
필터에 적용된 파일만 가지고 히스토리를 재구축하는 기능이다.
이번에 다룰 내용은 특정 파일에 대한 기록을 제외하고 재구축 하는 것에
대한 내용이다.
어떤 경우에 쓰면 좋을까?
개발을 진행하면서 깃허브 레포지토리에 push할때 간혹 실수를 하게 될 때가 있다.
예를 들면 절대로 공유되어선 안될 민감한 정보들이 담겨있는 env파일이
푸쉬되어버린 경우에는 아무리 이후에 gitignore파일을 수정하고 깃허브에서 푸쉬된
env파일을 삭제해도 해당 레포지토리의 공개범위가 public인 경우라면 히스토리를
확인하면 env파일의 내용을 누구나 볼 수가있다. 그렇기 때문에 Git의 히스토리 자체를
필터링하여 특정 히스토리를 삭제하고 깃허브에 적용해주어야 할 경우에 많이 사용한다.
filter-branch를 사용하게 된 계기
과거 개발 입문당시에 env파일을 실수로 push했던 일이 있었고 레포지토리에서 삭제하면
나에게만 보여지고 다른 유저는 볼 수 없을 것이라고 생각했었던 것 같다. 그렇게 둘러보다
2가지 프로젝트에서 env파일을 삭제했던 기록이 남아있었고 삭제처리가 필요했다. 때문에
git에서 제공하는 filter-branch라는 기능을 알게되었고 이 기능을 사용하여 env에 대한
기록을 모두 제거하고 재구축했다.
사용예시
1. 기능사용 환경
내가 filter-branch를 사용한 환경은 백엔드와 프론트엔드를 동시 개발을 진행하고 있었기 때문에
project라는 디렉토리 안에 fontend, backend 두가지 디렉토리로 나누어 개발했다. project디렉토리
내부에 존재하는 frontend와 backend디렉토리를 스테이징 시켜 버전을 관리하고 있었기 때문에
깃허브 레포지토리에는 fontend, backend 두가지 디렉토리가 존재하고 있는 환경이였다.
2. 기능사용이 가능한 위치
반드시 해당 기능은 최상위 트리에서만 실행해야 한다. 나의 경우는 fontend디렉토리가 아닌
backend디렉토리에서 env파일에 대한 기록을 삭제해야하기 때문에 처음에는 backend디렉토리 에서
파워쉘을 열어 filter-branch 명령어를 사용했었다. 하지만 실행되지 않았다.
그 이유는 최상위 디렉토리는 backend디렉토리가 아닌 project디렉토리이기 때문이다.
반드시 최상위 트리인 project디렉토리에서 명령어를 실행시켜야 하며 명령어를 작성할때
경로만 backend/... 이렇게 지정해주면 되는 것이다.
3. 예시코드
# 코드의 두번째 줄에서 backend/.env 는 필터링해줄 경로+파일
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch
backend/.env' --prune-empty -- --all
# 이 후에 강제 push 해준다.
git push origin main --force
위에 명령어는 지정된 경로에서 지정된 파일과 일치하지 않는 히스토리만을 남긴채로
재구축하는 명령어다. " Ref 'backend/.env' was rewritten " 명령어가 나오면 재구축이 완료된 것이다.
이후에 강제푸쉬를 해주고 깃허브 레포지토리를 확인해보면 원하는 히스토리가 사라져 있는 것을
볼 수 있다.
마치며...
나의 경우는 특별히 문제없이 기능이 잘 수행되었고 문제를 해결할 수 있었지만 타 기술블로그를 찾아 보니 불가피하게 문제해결을 의도하지 못한 방향으로 해결해야하는 상황도 종종있는 것 같았다. 아무리 문제를 해결할 수 있는 좋은 기능들이 있다고 하여도 너무 맹신하는 것 보다는 미리 문제를 방지할 수 있는 기반을 구축한 후에 개발을 진행하는 것이 가장 중요하다고 생각했다.
'Git > Github' 카테고리의 다른 글
[ GitHub ] 깃허브 사용해보기 (0) | 2023.03.19 |
---|